【问题标题】:Read&parse text file line by line in VBA - code keeps reading in everything all at once在 VBA 中逐行读取和解析文本文件 - 代码会同时读取所有内容
【发布时间】:2020-12-01 12:58:39
【问题描述】:

我正在尝试将数字文本文件读取到 excel VBA 中,并且代码会一次读取所有内容,而不是逐行读取。 使用此代码,常规测试文件 (test.txt) 会逐行读取,而我想要的文件 (TJS-3_43874_Generated_TLE.txt) 不会。我可以将 TJS-3_43874_Generated_TLE.txt 的各个行逐行剪切成一个干净的文本文件,它会正确读取,但我有一个很大的文件列表,这不是一个很好的时间利用。是否有隐藏角色或我缺少的东西?

我希望有人能阐明我做错了什么。谢谢!

这基本上是我读过的所有代码的格式:

Sub testread()

Dim myFile As String, text As String, textline As String, posLat As Integer, posLong As Integer

myFile = "C:\Users\TJS-3_43874_Generated_TLE.txt"
'myFile = "C:\Users\test.txt"

Open myFile For Input As #1

Do Until EOF(1)
    Line Input #1, textline
    text = text & textline
Loop
Close #1

End Sub

test.txt

Some information here..

latitude: 72n31
longitude: 15w27

Some information here..

TJS-3_43874_Generated_TLE.txt

1 43874U 18110A   20124.62500000  .00000092  00000-0  34605-0 0 00001
2 43874 000.0554 290.8570 0002993 254.0264 075.0858 01.00270444005065

【问题讨论】:

  • 另外值得注意的是:TJS-3_43874_Generated_TLE.txt 可以被 matlab 和 python 的逐行阅读器读取。

标签: excel vba


【解决方案1】:

在 VBA 中读取文本文件时,每行都会删除换行符。保存行时,追加vbCrLf

试试这个代码:

Sub testread()

    Dim myFile As String, text As String, textline As String, posLat As Integer, posLong As Integer
    
    myFile = "C:\Users\TJS-3_43874_Generated_TLE.txt"
    'myFile = "C:\Users\test.txt"
    
    Open myFile For Input As #1
    
    Do Until EOF(1)
        Line Input #1, textline
        Debug.Print textline
        
        text = text & textline & vbCrLf
    Loop
    Debug.Print text
    Close #1

End Sub

【讨论】:

  • 如果原始“换行符”似乎没有从原始文本文件中读取,有什么可以做的吗?例如,如果我想在将每一行保存到“文本”字符串之前将其括在引号中?如果它把两行都读成一行,我看不出有办法告诉第一行在哪里结束。谢谢!
【解决方案2】:

Line Input # 查找 Chr(13) 字符或 Chr(13)Chr(10) 序列来识别一行停止的位置和下一行的开始位置。一些操作系统或程序生成的文件只使用 Chr(10) 来分隔每一行,Line Input # 会将这些文件的内容读入一个长行。

要检查您的文件是否属于这种情况,请尝试:

Line Input #1, textline

If InStr(textline, Chr$(10)) > 0 Then
    MsgBox "Line contains embedded Chr(10) characters"
End If

假设确实有嵌入的 Chr(10) 字符,那么我们可以将textline 拆分成一个数组来恢复各个行:

Dim sLines() As String
Dim vLine As Variant

sLines = Split(textline, Chr$(10))
For Each vLine In sLines
    MsgBox vLine
Next vLine

请注意,vLine 必须是 Variant 才能在 For Each...Next 循环中使用。将MsgBox vLine 部分替换为您需要在每一行上执行的任何处理

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多