Что сверхбыстрый путь состоит в том, чтобы считать большие файлы линию за линией в VBA?

Учась немного больше на предмет этого ответа, я понимаю, что это было определенное упрощение. Различие между этим циклом:

for (some_iterator = some_vector.begin(); some_iterator != some_vector.end();
    some_iterator++)
{
    //do stuff
}

И этот цикл:

for (int i = 0; i < some_vector.size(); i++)
{
    //do stuff
}

довольно минимально. На самом деле синтаксис выполнения циклов этот путь, кажется, растет на мне:

while (it != end){
    //do stuff
    ++it;
}

Итераторы действительно разблокировали некоторые довольно мощные декларативные функции, и, когда объединено с библиотекой алгоритмов STL можно сделать некоторые довольно прохладные вещи, которые выходят за рамки индекса массива administrivia.

14
задан halfer 17 April 2017 в 21:18
поделиться

3 ответа

Для этого вы можете использовать Scripting.FileSystemObject. Из Ссылки :

Метод ReadLine позволяет сценарию читать отдельные строки в текстовом файле. Чтобы использовать этот метод, откройте текстовый файл, а затем настройте цикл выполнения, который продолжается до тех пор, пока свойство AtEndOfStream не станет равным True. (Это просто означает, что вы достигли конца файла.) В цикле Do Loop вызовите метод ReadLine, сохраните содержимое первой строки в переменной, а затем выполните какое-либо действие. Когда сценарий зацикливается, он автоматически опускает строку и считывает вторую строку файла в переменную. Это будет продолжаться до тех пор, пока каждая строка не будет прочитана (или пока сценарий специально не выйдет из цикла).

И быстрый пример:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\FSO\ServerList.txt", 1)
Do Until objFile.AtEndOfStream
 strLine = objFile.ReadLine
 MsgBox strLine
Loop
objFile.Close
13
ответ дан 1 December 2019 в 07:52
поделиться

С помощью этого кода вы загружаете файл в память (в виде большой строки) и затем вы читаете эту строку строка за строкой.

Используя Mid $ () и InStr (), вы фактически читаете «файл» дважды, но, поскольку он находится в памяти, проблем нет.
Я не знаю, имеет ли VB String ограничение длины (возможно, нет), но если размер текстовых файлов составляет сотни мегабайт, вероятно, произойдет падение производительности из-за использования виртуальной памяти.

2
ответ дан 1 December 2019 в 07:52
поделиться

Я думаю, что в сценарии с большим файлом использование потока было бы гораздо более эффективным, потому что потребление памяти было бы очень маленьким.

Но ваш алгоритм может переключаться между использованием потока и загрузкой всего объекта в память в зависимости от размера файла. Я не удивлюсь, если один будет лучше другого только по определенным критериям.

1
ответ дан 1 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: