从 txt 文件导入 CSV 数据,跳过第一行并添加标题

问题描述 投票:0回答:1

我获得了一个 .txt 文件,该文件表示用分号分隔的一组数据。第一行由 5 个数据字段组成,独立于其余行。同时,其他行表示以 16 个字段分隔的数据集(不包括标题行)。 问题是我在编写代码以在 Excel 中执行以下操作时遇到困难:

  • 在 A1:E1 范围内插入第一行
  • 根据 A3 单元格中的其余数据创建一个 ListObject 表,同时添加相应的标题。

我已经没有想法了,我不知道如何解决这个问题。非常感谢!

诗。数据由大约 20.000 多个条目组成,所以我不知道迭代分隔符是否有效。

我尝试修改原始输入文件,但在删除第一行并添加标题同时保留工作簿中已擦除行的数据时遇到了一些问题。此外,除非数据是从 csv 文件导入的,否则我似乎无法添加 List 对象表,这意味着文件转换。

CSV 示例

COUNTRY;31/12/2024;31/12/2024;1;NA002
EUR;1;XXXX;;ZZZZ;YY;;-99374;;;-84750;DEP;;-20474
EUR;1;XXXX;;ZZZZ;YY;;-72843;;;-55582;DEP;;-25107
EUR;1;XXXX;;ZZZZ;YY;;-43929;;;-58231;DEP;;-19313
EUR;1;XXXX;;ZZZZ;YY;;-63419;;;-23753;DEP;;-58099
EUR;1;XXXX;;ZZZZ;YY;;-15823;;;-10315;DEP;;-29964
EUR;1;XXXX;;ZZZZ;YY;;-25517;;;-51326;DEP;;-9411
EUR;1;XXXX;;ZZZZ;YY;;-72852;;;-46947;DEP;;-46277
EUR;1;XXXX;;ZZZZ;YY;;-62011;;;-58741;DEP;;-67422
EUR;1;XXXX;;ZZZZ;YY;;-11243;;;-85323;DEP;;-85026
EUR;1;XXXX;;ZZZZ;YY;;-54993;;;-34625;DEP;;-20409
EUR;1;XXXX;;ZZZZ;YY;;-17647;;;-58004;DEP;;-49106
EUR;1;XXXX;;ZZZZ;YY;;-78266;;;-31639;DEP;;-37452
EUR;1;XXXX;;ZZZZ;YY;;-95180;;;-32508;DEP;;-79336
EUR;1;XXXX;;ZZZZ;YY;;-50861;;;-33265;DEP;;-33790
EUR;1;XXXX;;ZZZZ;YY;;-8484;;;-98502;DEP;;-99399
EUR;1;XXXX;;ZZZZ;YY;;-55098;;;-52802;DEP;;-4358
EUR;1;XXXX;;ZZZZ;YY;;-81368;;;-86121;DEP;;-86581

excel vba
1个回答
0
投票

非 PowerQuery 版本:

Sub ReadData()
    
    Const SEP As String = ";"
    Dim content As String, lines As Variant
    Dim arr, headers, ws As Worksheet, n As Long
    
    content = GetContent("C:\Temp\data.txt")
    lines = Split(content, vbCrLf) 'assuming regular Windows line breaks
    
    Set ws = ThisWorkbook.Worksheets("Data")
    
    arr = Split(lines(0), SEP)
    'populate first line
    PutRow ws.Range("A1"), arr
    
    'create the headers
    headers = Array("Col1", "col2", "Col3") 'etc etc
    PutRow ws.Range("A2"), headers
    
    'add the rest of the lines
    Application.ScreenUpdating = False
    For n = 1 To UBound(lines)
        arr = Split(lines(n), SEP)
        PutRow ws.Range("A2").Offset(n), arr
    Next n
    Application.ScreenUpdating = True
    
End Sub
'return all content from a text file
Function GetContent(f As String) As String
    GetContent = CreateObject("scripting.filesystemobject"). _
                  OpenTextFile(f, 1).ReadAll()
End Function

'place a zero-based 1D array on a worksheet 
Sub PutRow(c As Range, arr As Variant)
    c.Resize(1, UBound(arr) + 1).Value = arr
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.