Читать текстовый файл построчно

У меня проблемы с созданием VBScript для чтения текста построчно. Вот шаги, которые должен сделать код:

Прочитать folder.txtОткройте файл, указанный в папке .txtЭхо содержимое внутри test.txtЧитать папку-list.txtОткройте файл, указанный в папке-list.txtОткройте dirlist.txt и эхо построчно

Пример того, что содержит folder.txt:

C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\test.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[12CUT] _____ (Gakkou no Kaidan) [518382]\test.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[2____] _____!__CD__________ [521206]\test.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[Ability] _____________________ [514182]\test.txt

Пример того, что содержит folder-list.txt:

C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\dirlist.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[12CUT] _____ (Gakkou no Kaidan) [518382]\dirlist.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[2____] _____!__CD__________ [521206]\dirlist.txt
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[Ability] _____________________ [514182]\dirlist.txt

Пример того, что содержит каждый dirlist.txt

C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\00.jpg
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_01.jpg
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_02.jpg
C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_03.jpg

И это код VBScript

Option Explicit

Dim objFSO, strTextFile, strData, strLine, arrLines, aniTextFile, aniData, aniLines, meLine, objTextFile, fso, inputFileList, sFolderName, fname
Dim iim1, iret, iret2, iret3, i
CONST ForReading = 1

strTextFile = "C:\Documents and Settings\Administrator\Desktop\ArtistCG\folder.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
strData = objFSO.OpenTextFile(strTextFile,ForReading).ReadAll
arrLines = Split(strData,vbCrLf)

For Each strLine in arrLines
  strData = objFSO.OpenTextFile(strLine,ForReading).ReadAll
WScript.Echo strData

aniTextFile = "C:\Documents and Settings\Administrator\Desktop\ArtistCG\folder-list.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
aniData = objFSO.OpenTextFile(aniTextFile,ForReading).ReadAll
aniLines = Split(aniData,vbCrLf)

Set fso = CreateObject("Scripting.FileSystemObject")
Set listFile = fso.OpenTextFile(aniLines).ReadAll
do while not listFile.AtEndOfStream 
    fName =  listFile.ReadLine()
    WScript.Echo fName
    Loop
Next

Пока что у меня работают только шаги с 1 по 4, но я не могу прочитать dirlist.txt. Какие-нибудь решения здесь?

Ответы на вопрос(1)

Решение Вопроса

Линия

Set listFile = fso.OpenTextFile(aniLines).ReadAll

не будет работать по двум причинам:

Set можно использовать только при назначенииобъекты переменным, ноReadAll возвращаетстрока.OpenTextFile() ожидает строку, ноaniLines являетсямассив струн.

Чтобы обработать все элементы массива, вы можете использовать что-то вроде этого:

For Each line In aniLines
  ' read dirlist.txt file
Next

Вопрос в том, как вы хотите прочитатьdirlist.txt файлы. Вы можете сделать то же самое, что и с другими файлами: прочитать все содержимое файла и разбить его на массив:

listFile  = fso.OpenTextFile(line).ReadAll
listLines = Split(listFile, vbCrLf)

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

Или вы могли бы использоватьReadLine подход (который предпочтителен, когда вам нужно обрабатывать большие файлы, потому что он избегает исчерпания памяти):

Set listFile = fso.OpenTextFile(line)  ' <-- remove .ReadAll from this line!
Do Until listFile.AtEndOfStream
  fName = listFile.ReadLine
  ' do stuff with fName
Loop

Я рекомендую использоватьDo Until вместоDo While Notпотому что семантика та же самая, но первая ближе к естественному языку и, таким образом, легче читается.

Также было бы достаточно создать экземплярFileSystemObject Объект один раз в начале сценария и просто использовать этот экземпляр в оставшейся части сценария. Бессмысленно создавать его снова и снова.

 Daniel31 окт. 2012 г., 04:29
+1, хотя я бы предложил использоватьReadLine просто потому, что это имеет гораздо больше смысла, чемReadAll & Splitкомбо.

Ваш ответ на вопрос