将CSV文件的内容加载到数组而不打开文件

时间:2013-02-16 07:13:59

标签: arrays excel-vba excel-vba-mac excel-2011 vba

我需要将超过6000个csv文件整理到单个csv文档中。目前的VBA流程是: 1.打开单个CSV数据文件 2.根据行数将文件内容加载到数组 3.关闭单个CSV文件 4.流程数组

为了提高代码和处理的效率,我希望有一种方法可以将单个CSV文件中的数据加载到数组中,而无需打开和关闭每个文件。

我正在使用Excel 2011 for Mac。

3 个答案:

答案 0 :(得分:3)

好的我假设所有6000个文件都具有相同的格式。

我的测试条件

  1. 我有一个名为C:\ Temp \的文件夹,其中包含6000个CSV文件
  2. 所有csv文件都有40行和16列
  3. 在Excel 2010中测试过。无法访问2011.将在2011年大约30分钟内进行测试。
  4. 我运行了以下代码,代码只用了4秒。

    Option Explicit
    
    Sub Sample()
        Dim strFolder As String, strFile As String
        Dim MyData As String, strData() As String
        Dim FinalArray() As String
        Dim StartTime As String, endTime As String
        Dim n As Long, j As Long, i As Long
    
        strFolder = "C:\Temp\"
    
        strFile = Dir(strFolder & "*.csv")
    
        n = 0
    
        StartTime = Now
    
        Do While strFile <> ""
            Open strFolder & strFile For Binary As #1
            MyData = Space$(LOF(1))
            Get #1, , MyData
            Close #1
    
            strData() = Split(MyData, vbCrLf)
            ReDim Preserve FinalArray(j + UBound(strData) + 1)
            j = UBound(FinalArray)
    
            For i = LBound(strData) To UBound(strData)
                FinalArray(n) = strData(i)
                n = n + 1
            Next i
    
            strFile = Dir
        Loop
    
        endTime = Now
    
        Debug.Print "Process started at : " & StartTime
        Debug.Print "Process ended at : " & endTime
        Debug.Print UBound(FinalArray)
    End Sub
    

    文件夹的屏幕截图

    enter image description here

    代码输出的屏幕截图

    enter image description here


    <强>更新

    好的,我在MAC测试了它

    我的测试条件

    1. 我在桌面上有一个名为Sample的文件夹,其中有1024个CSV文件
    2. 所有csv文件都有40行和16列
    3. 在Excel 2011中测试过。
    4. 我运行了以下代码,代码耗时不到1秒(因为只有1024个文件)。所以我希望它再次运行4秒,以防有6k文件

      Sub Sample()
          Dim strFile As String
          Dim MyData As String, strData() As String
          Dim FinalArray() As String
          Dim StartTime As String, endTime As String
          Dim n As Long, j As Long, i As Long
      
          StartTime = Now
      
          MyDir = ActiveWorkbook.Path
          strPath = MyDir & ":"
      
          strFile = Dir(strPath, MacID("TEXT"))
      
          'Loop through each file in the folder
          Do While Len(strFile) > 0
              If Right(strFile, 3) = "csv" Then
                  Open strFile For Binary As #1
                  MyData = Space$(LOF(1))
                  Get #1, , MyData
                  Close #1
      
                  strData() = Split(MyData, vbCrLf)
                  ReDim Preserve FinalArray(j + UBound(strData) + 1)
                  j = UBound(FinalArray)
      
                  For i = LBound(strData) To UBound(strData)
                      FinalArray(n) = strData(i)
                      n = n + 1
                  Next i
      
                  strFile = Dir
              End If
              strFile = Dir
          Loop
      
          endTime = Now
      
          Debug.Print "Process started at : " & StartTime
          Debug.Print "Process ended at : " & endTime
          Debug.Print UBound(FinalArray)
      End Sub
      

      文件夹的屏幕截图

      enter image description here

      代码输出的屏幕截图

      enter image description here

答案 1 :(得分:1)

您不需要使用Excel执行此操作,您可以通过输入以下命令提示符合并使用Windows副本进行合并:

copy *.csv mergedfilename.csv

答案 2 :(得分:0)

在我看来,对你的问题没有Excel答案 - 无论如何肯定不在其正常定义范围内。

解决它的正确方法是使用适合任务的编程语言;例如perl,甚至是命令shell,来组合文件。 Excel不是用于常量文件i / o,但perl非常擅长处理大量文件。我在一个相对较小的unix服务器上几分钟内完成了一个与此类似的项目(合并了数百万个文件)。

你也可以使用命令shell将文件合并在一起(cat = concatenate),正如nneonneo在评论中建议的那样;我不知道哪个更快。 Perl当然需要更长的代码,特别是如果你必须首先学习perl(尽管'网上有很多例子)。