我需要将 6000 多个 csv 文件整理成一个 csv 文档。当前的 VBA 流程是: 1. 打开单个 CSV 数据文件 2. 根据行数将文件内容加载到数组 3. 关闭单个 CSV 文件 4. 处理数组
为了提高代码和处理的效率,我希望有一种方法可以将单个 CSV 文件中的数据加载到数组中,而无需打开和关闭每个文件。
我正在使用 Excel 2011 for Mac。
我需要将 6000 多个 csv 文件整理成一个 csv 文档。当前的 VBA 流程是: 1. 打开单个 CSV 数据文件 2. 根据行数将文件内容加载到数组 3. 关闭单个 CSV 文件 4. 处理数组
为了提高代码和处理的效率,我希望有一种方法可以将单个 CSV 文件中的数据加载到数组中,而无需打开和关闭每个文件。
我正在使用 Excel 2011 for Mac。
好的,我假设所有 6000 个文件都具有相同的格式。
我的测试条件
我运行了下面的代码,代码只用了 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 秒(因为只有 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
文件夹截图
代码输出的屏幕截图
您不需要使用 Excel 来执行此操作,您可以在命令提示符下使用 windows 复制进行合并,方法是输入:
copy *.csv mergedfilename.csv
在我看来,您的问题没有 Excel 答案 - 无论如何,当然不在其正常定义范围内。
解决它的正确方法是使用适合该任务的编程语言;perl,例如,甚至命令 shell,来组合文件。Excel 不是为恒定文件 i/o 而设计的,但 perl 非常擅长处理大量文件。我在一个相对较小的 unix 服务器上在几分钟内执行了一个类似的项目(组合数百万个文件)。
正如 nneonneo 在评论中建议的那样,您还可以使用命令 shell 将文件组合在一起(cat=concatenate);我不能说哪个更快。Perl 肯定会花费更长的时间来编写代码,特别是如果您必须先学习 perl(尽管网上有很多示例)。