【问题标题】:Convert a txt file that uses space delimiter to tab delimiter将使用空格分隔符的 txt 文件转换为制表符分隔符
【发布时间】:2019-01-23 14:06:39
【问题描述】:

我有一个 Excel 文件,它从第三方自动生成的各种 txt 文件中导入价格。我使用其中一个 txt 文件遇到了障碍,因为它使用空格分隔,而其他文件使用制表符。由于空间分隔,当我拆分数据时,我在每一列中得到不同的值。

这是我目前要打开和阅读的文本文件

        usFileName = PathName & "\" & "Prices.txt"

        If fs.FileExists(usFileName) Then
            Set US = fs.OpenTextFile(usFileName, 1)

            theData = US.ReadLine
            getDate = Split(theData, Chr(0))
            curDate = Trim(Left(getDate(0), 10))

            If curDate = ActiveSheet.Range("Sheet_Date") Then
                    Do While Not US.AtEndOfStream
                        On Error Resume Next
                        Ln = US.ReadLine
                        Cols = Split(Ln, "  ")
                        Price = Trim(Cols(7))
                        NameTrim = Trim(Replace(Cols(1), "USO-", ""))
                        CellName = Replace(NameTrim, "-", "_") & "_" & Trim(Cols(2))

                        If ActiveSheet.Range(CellName) Is Nothing Then
                            ''Do Nothing here
                            On Error Resume Next
                        Else

                            Set TxtRng = ActiveSheet.Range(CellName)

                            If TxtRng = ActiveSheet.Range(CellName) Then
                                TxtRng.Value = Price
                            End If
                        End If
                    Loop

                Else
                    MsgBox ("The current sheet date does not match the US file import date.")
                End If

            US.Close
        Else
            MsgBox ("The file Prices.txt does not exist.")
        End If

这是 txt 文件的样子:

01/11/2019 06:00 PM  USO-FOX-USO  E10           8.9929     0.0000
01/11/2019 06:00 PM  USO-FOX-USO  CON8HE10      1.3212    -0.0244
01/11/2019 06:00 PM  USO-FOX-USO  CON8HE10TT    1.3232    -0.0244

这就是 Cols 变量的样子。

【问题讨论】:

  • 您使用On Error Resume Next 的方式是一种非常糟糕的做法。此行隐藏了 所有 错误消息,但错误仍然存​​在,您只是看不到它们,因为它使您失明。但问题是您无法修复您看不到的错误。如果您不修复它们,您的代码将无法正常工作。完全删除这些On Error Resume Next 行并正确修复您遇到的错误。
  • 我得到的错误是因为单元格名称不存在或无法正确匹配单元格。我知道这是不好的做法,但目前它忽略的错误并不关心我。
  • 然后以这种方式修复它,它会忽略您想要的特定错误,而不是像目前那样每个错误。您无法在此状态下正确调试/处理您的代码。确保On Error Resume Next 正好在您期望错误所在的行之前,并在您期望错误重新启用错误报告的行之后使用On Error Goto 0!另见VBA Error Handling – A Complete Guide
  • 请注意,On Error Resume Next 不仅会隐藏 next 错误消息,因为它看起来像。相反,它会隐藏 所有 消息,直到 On Error Goto 0End Sub
  • 我删除了,没有错误。

标签: excel vba


【解决方案1】:

试试

Sub Test()

    Dim PathName As String
    Dim usFileName  As String

    PathName = "Your path"
    usFileName = PathName & "\" & "Prices.txt"

    Workbooks.OpenText Filename:=usFileName, _
        StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), _
        Array(19, 1), Array(32, 1), Array(48, 1), Array(55, 1))

End Sub

【讨论】:

    【解决方案2】:

    您可以尝试删除空格并以这种方式替换它们:

        Ln = US.ReadLine
        Do While (InStr(Ln, "  ") > 0)
            Ln = Replace(Ln, "  ", " ")
        Loop
        'The only problem I see is the case where you have Time (6:00 PM) this 
        '    would replace the space with Tab. in that case, I would do the following:
        Ln = Replace(Ln, " PM", "PM")
        Ln = Replace(Ln, " AM", "AM")
        Ln = Replace(Ln, " ", vbTab)
    
        'And then put them back
        Ln = Replace(Ln, "PM", " PM")
        Ln = Replace(Ln, "AM", " AM")
    
        'Finally, split the columns
        Cols = Split(Ln, vbTab)
    

    如果您想尝试使用固定宽度,请执行以下操作(在 Ln = US.Readline 之后):

        '01/11/2019 06:00 PM  USO-FOX-USO  E10           8.9929     0.0000    
        'Do the following only if (InStr(Ln, "  ") > 0)
        strCol1 = Mid(Ln, 1, 21)  
        strCol2 = Mid(Ln, 22, 13)  
        strCol3 = Mid(Ln, 35, 13)  
        strCol4 = Mid(Ln, 48, 11)  
        strCol5 = Mid(Ln, 59, Len(Ln))  
    
    

    【讨论】:

    • 是的,我已经尝试过这样做。即使我使用 Power Query 之类的工具将文件导入到 excel 中,它也很适合。获得我需要的列的唯一方法是使用固定的。
    • 好的,我在答案的末尾添加了一段额外的代码。试试看。
    • @IAmNerd2000 请注意,您不能删除空格。这将使您的数据崩溃,例如,如果一个字段为空,则所有其他字段将向左移动一个字段!所以数据的位置改变了列。这只能用固定长度的字段来解决。
    • @Pᴇʜ 我为 OP 提供了两个不同的选项。如果你看第二个,你会发现我也提供了一个固定宽度的版本(只有 mid 功能)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多