逐行读取txt文件

Tri*_*ham 5 vbscript

我无法让vbscript逐行读取文本.这是代码应该执行的步骤:

  1. 读取folder.txt
  2. 打开folder.txt中列出的文件
  3. 回显test.txt中的内容
  4. 读取folder-list.txt
  5. 打开folder-list.txt中列出的文件
  6. 打开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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

每个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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只有步骤1到4工作,但我无法阅读dirlist.txt.有解决方案吗?

Ans*_*ers 18

这条线

Set listFile = fso.OpenTextFile(aniLines).ReadAll
Run Code Online (Sandbox Code Playgroud)

不会有两个原因:

  • Set只能在将对象分配给变量时使用,但ReadAll返回一个字符串.
  • OpenTextFile()需要一个字符串,但是aniLines是一个字符串数组.

要处理数组的所有元素,您可以使用以下内容:

For Each line In aniLines
  ' read dirlist.txt file
Next
Run Code Online (Sandbox Code Playgroud)

问题是你想如何阅读dirlist.txt文件.您可以像对待其他文件一样执行相同操作:读取文件的整个内容并将其拆分为数组:

listFile  = fso.OpenTextFile(line).ReadAll
listLines = Split(listFile, vbCrLf)
Run Code Online (Sandbox Code Playgroud)

然后使用像上面那样的另一个循环来处理数组的字段listLines.这种方法对于小文件是优选的,因为代码更简单.

或者您可以使用该ReadLine方法(当您必须处理大型文件时,这是可取的,因为它可以避免内存耗尽):

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

我推荐使用Do Until而不是Do While Not,因为语义是相同的,但前者更接近自然语言,因此更容易阅读.

此外FileSystemObject,只需在脚本开头实例化一次对象就足够了,只需在脚本的其余部分使用该实例即可.一遍又一遍地实例化它是毫无意义的.

  • +1,虽然我建议使用`ReadLine`只是因为它比`ReadAll`和`Split`combo更有意义. (2认同)