2

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

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

我正在使用 Excel 2011 for Mac。

4

3 回答 3

3

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

我的测试条件

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

我运行了下面的代码,代码只用了 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

文件夹截图

在此处输入图像描述

代码输出的屏幕截图

在此处输入图像描述


更新

好的,我在 MAC 中测试过

我的测试条件

  1. 我在桌面上有一个名为 Sample 的文件夹,其中包含 1024 个 CSV 文件
  2. 所有 csv 文件都有 40 行和 16 列
  3. 在 Excel 2011 中对其进行了测试。

我运行了下面的代码,代码用时不到 1 秒(因为只有 1024 个文件)。因此,如果有 6k 个文件,我希望它再次运行 4 秒

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

文件夹截图

在此处输入图像描述

代码输出的屏幕截图

在此处输入图像描述

于 2013-02-16T11:49:56.210 回答
2

不需要使用 Excel 来执行此操作,您可以在命令提示符下使用 windows 复制进行合并,方法是输入:

copy *.csv mergedfilename.csv
于 2015-07-29T19:34:56.897 回答
-1

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

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

正如 nneonneo 在评论中建议的那样,您还可以使用命令 shell 将文件组合在一起(cat=concatenate);我不能说哪个更快。Perl 肯定会花费更长的时间来编写代码,特别是如果您必须先学习 perl(尽管网上有很多示例)。

于 2013-02-16T07:25:47.047 回答