从文本文件读取并获得不同的输出,即使我在调试器中也可以看到它

时间:2018-10-06 22:59:10

标签: excel vba

我正在阅读一个文本文件,但看不到所有行。我可以看到文字行的值,因为它显示在 查看->本地窗口。调试时,我将鼠标悬停在保存文本行的变量上,并查看该值是什么。

示例: 该行有效: *校准数据-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

2 个答案:

答案 0 :(得分:1)

向社区致歉!我只是发现发生了什么事,所以有两倍。

  1. 我在哪里设置断点是错误的。它向我显示了上一个文本行,而不是最新文本行。

  2. 我不明白If (InStr(1, , searchTerms(a1)) > 1) ThenIf (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与Uni​​code,国家字符,vbLf与vbCrLf)。您可以使用十六进制编辑器检查输入文件以更深入地了解。无论如何,一开始最简单的检查就是查看VBA如何读取记录:

Do While Not txtStream.AtEndOfStream
    LineFromFile = txtStream.ReadLine
    i = i + 1
    Debug.Print CStr(i) & ": ***" & LineFromFile & "***"
Loop