Варианты разбора текстового файла на столбцы - PullRequest
0 голосов
/ 02 марта 2020

Я ищу некоторые входные данные и возможный пример разбора текстового файла в следующем формате: (извините, не знаете, как сохранить форматирование файла в этом тексте)

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 и т. Д. c. без соответствующей строки ОПИСАНИЕ.

Вот пример того, как данные теперь выглядят в файле:

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

Я хотел бы проанализировать ИМЯ, ИД, ФОРМАТ, КОРОТКОЕ ИМЯ и ОПИСАНИЕ в 5 отдельных столбцов в файле CSV или Excel для дополнительного анализа. Мне все равно, если поле DESCRIPTION разбито на несколько строк, но его также можно объединить в одну более длинную строку.

Надеюсь, все это имеет смысл. Заранее спасибо!

1 Ответ

0 голосов
/ 03 марта 2020

Предоставление данных для 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
...