2012-10-31 18 views
5

Mam problem z przygotowaniem vbscriptu do czytania linii tekstu po linii. Jest kroki kod powinien zrobić:Odczytaj linię pliku txt po linii

  1. Czytaj folder.txt
  2. Otwórz plik wymieniony w folder.txt
  3. Echo zawartość wewnątrz test.txt
  4. przeczytane folderu liście. txt
  5. Otwórz plik wymieniony w folderze-lista.txt
  6. Otwórz plik lista.txt i echo linia po linii

Przykładem co folder.txt zawiera:

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 

przykładem tego, co Folder-lista.txt zawiera:

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 

Przykładem tego, co każdy plik Lista.txt zawiera

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 

A to kod 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 

Do tej pory otrzymałem tylko kroki od 1 do 4, ale nie mogę odczytać pliku dirlist.txt. Jakieś rozwiązania tutaj?

Odpowiedz

15

Linia

Set listFile = fso.OpenTextFile(aniLines).ReadAll 

nie będzie działać z dwóch powodów:

  • Set mogą być wykorzystane dopiero po przypisaniu obiektów do zmiennych, ale ReadAll zwraca ciąg.
  • OpenTextFile() spodziewa się ciągu znaków, ale aniLines jest ciągiem o numerze.

Aby przetworzyć wszystkie elementy tablicy, można użyć mniej więcej tak:

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

Pytanie brzmi, jak chcesz przeczytać dirlist.txt plików. Można zrobić to samo jak to było w przypadku innych plików: przeczytać całą zawartość pliku i podzielić go na tablicy:

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

a następnie użyć innej pętli jak ten powyżej przetwarzać pól tablicy listLines. Takie podejście jest preferowane w przypadku małych plików, ponieważ kod jest prostszy.

Albo można użyć podejście ReadLine (co jest preferrable kiedy trzeba przetwarzać duże pliki, ponieważ unika wyczerpanie pamięci):

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

Polecam używanie Do Until zamiast Do While Not, ponieważ semantyczny jest to samo, ale ten pierwszy jest bliższy naturalnemu językowi, a przez to łatwiejszy do odczytania.

Również wystarczy utworzyć instancję obiektu FileSystemObject raz na początku skryptu i po prostu użyć tej instancji w pozostałej części skryptu. Nie ma sensu tworzyć tego w kółko.

+2

+1, chociaż sugeruję użycie 'ReadLine' tylko dlatego, że ma o wiele więcej sensu niż" ReadAll' & "Split'combo. –

Powiązane problemy