【问题标题】:Options for parsing a text file to columns将文本文件解析为列的选项
【发布时间】:2020-06-15 01:21:28
【问题描述】:

我正在寻找一些输入和可能的示例来解析具有以下格式的文本文件:(抱歉,不确定如何在此文本中保留文件的格式)

NAME          ID         FORMAT         SHORT NAME  
    DESCRIPTION (this field is on the second row an indented by 5 spaces)

第一行(NAME、ID、FORMAT 和 SHORT NAME)总是只包含一行。描述文本可能跨越多行。在某些情况下,只有第一行 NAME、ID 等,没有对应的 DESCRIPTION 行。

下面是数据现在在文件中的样子的示例:

NAME          ID         FORMAT         SHORT NAME  
    DESCRIPTION
ABC          01          xx           AB
    abcdefg
    hijklm
    nopqrs
DEF          02          xx           DE
    abcedfg
    hijklmnopqrst
GHI          03          xx.x         GH
JKL          001         xx           JKL
    abcdef
    ghijk
    lmnopq
    rstu
    vwxyz

我想将 NAME、ID、FORMAT、SHORT NAME 和 DESCRIPTION 解析为 csv 或 excel 文件中的 5 个单独的列,以便进行额外分析。我不在乎DESCRIPTION字段是否跨越多行,但它也可以连接成一个更长的字符串。

希望这一切都有意义。提前致谢!

【问题讨论】:

  • 到目前为止您尝试了哪些方法,问题出在哪里?
  • 我试过用 excel 导入,但是描述行在第一行之后的多行上,并且不作为第一行的一部分导入。我无法在我的帖子中显示格式,但实际上一条记录由第一行(名称、ID、格式、短名称和说明)组成,但缩进的说明可能跨越多行。然后下一条记录再次以 NAME、ID、FORMAT、SHORT NAME 开头,然后是下一行或多行的DESCRIPTION。
  • edit your question 向我们提供您目前的情况和预期结果。我相信我所做的编辑使文本的格式接近它的样子,但它已被删除,使问题比以前更不清晰。我认为使用一个好的文本编辑器在Description 行的开头添加所需数量的选项卡可能是这里的方法。
  • 这能回答你的问题吗? Importing CSV with line breaks in Excel 2007
  • 谢谢 我现在有了正确的文件格式。这应该有助于描述问题。

标签: excel parsing text


【解决方案1】:

为 NAME、ID、FORMAT 和 SHORT NAME 提供数据是对齐的 在他们的标题词下方,然后在第一行使用这些词 计算每个字段的起始位置和长度,然后拆分 使用 Mid() 将行插入字段。加入描述行并写到 开始新记录之前的上一个记录。例如

Option Explicit
Sub ParseTextFile()

    Const INFILE = "c:\temp\testfile.txt"
    Const OUTFILE = "c:\temp\testfile.xlsx"

    Dim wbOut As Workbook, ws As Worksheet, iRow As Long
    Dim txt As String, ff As Integer, i As Integer, desc As String
    Dim start(4) As Integer, length(4) As Integer
    Dim count As Integer, msg As String

    Set wbOut = Workbooks.Add
    Set ws = wbOut.Sheets("Sheet1")
    ws.Range("A1:E1") = Array("NAME", "ID", "FORMAT", "SHORT NAME", "DESCRIPTION")
    ws.Columns("A:E").NumberFormat = "@"
    iRow = 1

    ff = FreeFile()
    Open INFILE For Input As #ff

    While Not EOF(ff)
        count = count + 1
        Line Input #ff, txt
        If count = 1 Then
            start(1) = InStr(1, txt, "NAME", vbTextCompare)
            start(2) = InStr(1, txt, "ID", vbTextCompare)
            start(3) = InStr(1, txt, "FORMAT", vbTextCompare)
            start(4) = InStr(1, txt, "SHORT NAME", vbTextCompare)
            For i = 1 To 3
                length(i) = start(i + 1) - start(i)
            Next
        Else
            If Left(txt, 1) = " " Then
                desc = desc & Trim(txt) & " "
            Else
                ' save the description from last record
                ws.Cells(iRow, 5) = Trim(desc)
                desc = ""

                ' new row
                iRow = iRow + 1
                length(4) = Len(txt) - start(4) + 1
                For i = 1 To 4
                    ws.Cells(iRow, i) = Mid(txt, start(i), length(i))
                Next
            End If
        End If
    Wend
    Close #ff

    ' final description
    ws.Cells(iRow, 5) = Trim(desc)

    ' save result
    ws.Columns("A:E").AutoFit
    wbOut.Close True, OUTFILE

    msg = count & " lines read from " & INFILE & vbCr & _
          iRow - 1 & " rows written to " & OUTFILE

    MsgBox msg, vbInformation
End Sub

【讨论】:

  • 非常感谢这个例子。它在 ws.Cells(iRow, i) = Mid(txt, start(i), length(i)) 调用的循环内生成错误。此时 start(i) 和 length(i) = 0。我正在使用 mac excel,所以不确定这是否是问题所在。似乎开始和长度变量正在重置?再次感谢!
  • @ 它适用于您发布的示例。错误信息是什么?标头必须是第 1 行,这是设置起始变量的唯一位置。它可能是文本文件上的 CR/LF 行结尾。是来自windows的文本文件吗?是 ASCII 还是一些 Unicode UTF-8?
  • 我拥有的文件没有标题。现在大部分情况下,名称在 ID 和 FORMAT 字段之间拆分,所以我只需要调整字段长度。再次感谢这太好了!!!
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2015-10-31
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多