【问题标题】:VBA - Split CSV file in multidimensional arrayVBA - 在多维数组中拆分 CSV 文件
【发布时间】:2016-04-19 13:55:00
【问题描述】:

我有一个 .csv,格式如下:

[TestHeader]FIELDS,"LANGUAGE","LC_NUMERIC","CELLNAME","TESTTYPE","REPORTER","TITLE","STARTDATE","STARTTIME","ENDDATE","ENDTIME"DATATYPE,"文本(80)","文本(80)","文本(64)","文本(80)","文本(80)","文本(80)","文本(12)","文本(20)","文本(12)","文本(20)"

我想把这些数据放在一个多维数组中,就像它在一张表中一样。如果单元格为空,则数组中的单元格也将为空。

我正在尝试使用以下内容,但它只将数据放在不适合我需要的一维数组中。

Dim Delimiter As String
Dim TextFile As Integer
Dim FilePath As String
Dim FileContent As String
Dim LineArray() As String
Dim DataArray() As String

'Inputs
  Delimiter = ","
  FilePath = emiFilePath

'Open the text file in a Read State
  TextFile = FreeFile
  Open FilePath For Input As TextFile

'Store file content inside a variable
  FileContent = Input(LOF(TextFile), TextFile)

'Close Text File
  Close TextFile

'Separate Out lines of data
  LineArray() = Split(FileContent, Delimiter, -1, vbTextCompare)

'Read Data into an Array Variable
      'Re-Adjust Array boundaries
        ReDim Preserve DataArray(UBound(LineArray))
'
      'Load line of data into Array variable
        For y = LBound(LineArray) To UBound(LineArray)
          DataArray(y) = Replace(LineArray(y), Chr(34), vbNullString)
        Next y

【问题讨论】:

  • 使用数组的任何具体原因?您是否考虑过 ADO 读取 CSV?
  • 什么是 ADO?我使用数组是因为我对它们非常熟悉。
  • @PankajJaju 指的是一种读取 CSV 文件的方法。这个网站上有十几个帖子显示了他所指的内容。只需寻找它们:stackoverflow.com/search?q=excel+vba+ado+csv 然而,如果您想坚持您的解决方案(我会支持),那么我不会将整个文件读入字符串,而是逐行读取,如下所示(接受的解决方案): stackoverflow.com/questions/11185191/…

标签: arrays vba excel csv


【解决方案1】:

在@Ralph 和@VincentG 的帮助下

Dim Delimiter As String
Dim TextFile As Integer
Dim FilePath As String
Dim FileContent As String
Dim LineArray() As String
Dim DataArray() As Variant

'Inputs
  Delimiter = ","
  FilePath = emiFilePath

'Open the text file in a Read State
  TextFile = FreeFile
  Open FilePath For Input As TextFile

'Store file content inside a variable
  FileContent = Input(LOF(TextFile), TextFile)

'Close Text File
  Close TextFile

'Separate Out lines of data
  LineArray() = Split(FileContent, vbLf, -1, vbTextCompare)

'Read Data into an Array Variable
      'Re-Adjust Array boundaries
        ReDim Preserve DataArray(UBound(LineArray))
'
      'Load line of data into Array, separate by commas and remove unwanted blank strings
        For y = LBound(LineArray) To UBound(LineArray)
          DataArray(y) = Split(Replace(LineArray(y), Chr(34), vbNullString), Delimiter)
        Next y

【讨论】:

    【解决方案2】:

    当你编码时:

    'Separate Out lines of data
      LineArray() = Split(FileContent, Delimiter, -1, vbTextCompare)
    

    您不是分隔行,而是由分隔符“,”分隔的字段

    如果你的 cvs 使用 Windows 风格的行尾,首先在 vbCrLf 上拆分你的数据。

    Function mySplit(ByVal emiFilePath As String) As Variant()
        Dim Delimiter As String
        Dim TextFile As Integer
        Dim FilePath As String
        Dim FileContent As String
        Dim LineArray() As String
        Dim DataArray() As Variant
        'Inputs
        Delimiter = ","
        FilePath = emiFilePath
    
        'Open the text file in a Read State
        TextFile = FreeFile
        Open FilePath For Input As TextFile
    
        'Store file content inside a variable
        FileContent = Input(LOF(TextFile), TextFile)
    
        'Close Text File
        Close TextFile
    
        'Separate Out lines of data
        LineArray = Split(FileContent, vbCrLf, -1, vbTextCompare)
        ReDim DataArray(LBound(LineArray) To UBound(LineArray))
        Dim i As Long
        'Separate fields inside the lines
        For i = LBound(LineArray) To UBound(LineArray)
          DataArray(i) = Split(LineArray(i), Delimiter, -1, vbTextCompare)
        Next i
        mySplit = DataArray
    End Function
    

    【讨论】:

    • 请注意,我的函数返回的是数组数组,而不是二维数组。
    • 我认为我的 .csv 文件中没有行。您的建议返回 1 行的 LineArray。
    • 那么您没有a CSV file,您必须找出“文本文件”中的记录是如何分隔的。
    • 也许您的文件使用旧的 MAC (vbCr) 或 UNIX (vbLf) 样式作为行尾。
    • @VincentG 谢谢!我用过vbLf,它确实分开了线条!现在我只需要在每一行中用逗号分隔。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多