我拼凑了一个有效的脚本,但不是100%。 我正在从文件(A)中读取值,然后在另一个文件(B)中的特定位置搜索匹配,然后将整行数据写入新文件(C)。 下面的脚本非常适合读取数据的第一行(文件A),但它不会超过第一行。
以下是我从文件(A)中搜索的字符串示例列表。
9899008KT2018012600000444 9899008KT2018012600000445
这是我的剧本:
Set fso = CreateObject("Scripting.FileSystemObject")
Set inFile = fso.OpenTextFile("C:\JeffTestFolder\9899008KT2018012600.txt", 1)
Set outFile = fso.OpenTextFile("C:\TestFolder\9899008KT2018012600_Compiled.txt", 8, True)
Set listFile = fso.OpenTextFile("C:\TestFolder\ListOfIDs.txt", 1)
Do Until listFile.AtEndOfStream
fName = listFile.ReadLine
Do Until inFile.AtEndOfStream
line = inFile.ReadLine
If Mid(line, 7, 25) = fName Then outFile.WriteLine line
Loop
Loop
我被困在如何将它转到Loop并读取文件(A)中的下一行然后在文件(B)中搜索该值并将其写入新文件(C)。
答案 0 :(得分:0)
如果你想比较A的每一行与B的每一行,你需要为A的每一行重复读取B:
Do Until listFile.AtEndOfStream
fName = listFile.ReadLine
Set inFile = fso.OpenTextFile("C:\JeffTestFolder\9899008KT2018012600.txt")
Do Until inFile.AtEndOfStream
line = inFile.ReadLine
If Mid(line, 7, 25) = fName Then outFile.WriteLine line
Loop
inFile.Close
Loop
或将整个文件读入数组或字典,并使用该数组/字典作为参考:
txt = fso.OpenTextFile("C:\JeffTestFolder\9899008KT2018012600.txt").ReadAll
arr = Split(txt, vbNewLine)
Do Until listFile.AtEndOfStream
fName = listFile.ReadLine
For Each line In arr
If Mid(line, 7, 25) = fName Then outFile.WriteLine line
Next
Loop
Set dict = CreateObject("Scripting.Dictionary")
txt = fso.OpenTextFile("C:\JeffTestFolder\9899008KT2018012600.txt").ReadAll
For Each line In Split(txt, vbNewLine)
dict(Mid(line, 7, 25)) = True
Next
Do Until listFile.AtEndOfStream
fName = listFile.ReadLine
If dict.Exists(fName) Then outFile.WriteLine line
Loop
选择哪一个取决于文件大小和系统资源。第二种和第三种方法提供了更好的性能,因为它们可以避免重复的磁盘I / O,但是当文件很大时可能会导致内存耗尽。