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