我正在阅读一个文本文件,但看不到所有行。我可以看到文字行的值,因为它显示在 查看->本地窗口。调试时,我将鼠标悬停在保存文本行的变量上,并查看该值是什么。
示例: 该行有效: *校准数据-YF079305 0490-0310-5338 * 当我将鼠标悬停在txtStream上时,阅读上面的行后,它将正确显示。
该行不是:8.41 25.34 2.29 1.04 1131 1156 65.54。 当我将鼠标悬停在txtStream上时,它什么也没读。当我拉本地Windows时,它表明数据在那里。
我的假设:关于读取以数字开头的文本行,我并不了解。我仍在努力,但我很困惑。
附带调查代码:
Dim fso As Variant: Set fso = CreateObject("Scripting.FileSystemObject")
Dim txtStream As Variant: Set txtStream = fso.OpenTextFile(FileAndPath, ForReading, False)
Do While Not txtStream.AtEndOfStream
LineFromFile = txtStream.ReadLine
' Data caputre, one line
For a1 = 0 To searchLen
If (InStr(1, searchTerms(a1), LineFromFile) > 1) Then
dataLine = Split(LineFromFile, vbTab)
' Data organize
For a2 = 0 To dataLen
dataArray(a1, a2) = dataLine(k + dataOffset)
Next a2
' Final data found
If (a1 = searchLen) Then
finalData = True
End If
End If
If (finalData = True) Then
finalData = False
For a3 = searchLen To 0
For a4 = 0 To dataLen
Cells(dataRowOffset, dataColumnOffset + a4).Value = dataArray(a3, dataColumnOffset + a4)
Next a4
dataColumnOffset = dataColumnOffset + dataLen
Next a3
End If
Next a1
Loop
txtStream.Close
答案 0 :(得分:1)
向社区致歉!我只是发现发生了什么事,所以有两倍。
我在哪里设置断点是错误的。它向我显示了上一个文本行,而不是最新文本行。
我不明白If (InStr(1, , searchTerms(a1)) > 1) Then
与If (InStr(1, LineFromFile, searchTerms(a1)) > 0) Then
不同。我在1位置找到searchTerm。 1不大于1。我不好。
答案 1 :(得分:0)
输入文件可能包含非打印字符,尤其是在另一个opsys下创建时。您可能考虑使用ReadAll
而不是ReadLine
,然后按记录分隔符Split
归档文件,并应用Worksheetfunction.Clean()
清除非打印字符,如下所示:
CompleteFile = txtStream.ReadAll
LineBuf = Split (CompleteFile, vbCrLf) ' or whatever the record separator is
For Each LineFromFile in LineBuf
LineFromFile = worksheetfunction.Clean(LineFromFile)
For a1 = 0 To searchLen ....
通常,当您在使用另一个opsys或什至另一个Windows版本创建的文件时遇到麻烦的问题时,最明显的错误是编码方式不同(ASCII与Unicode,国家字符,vbLf与vbCrLf)。您可以使用十六进制编辑器检查输入文件以更深入地了解。无论如何,一开始最简单的检查就是查看VBA如何读取记录:
Do While Not txtStream.AtEndOfStream
LineFromFile = txtStream.ReadLine
i = i + 1
Debug.Print CStr(i) & ": ***" & LineFromFile & "***"
Loop