我有一個要求將6000個csv文件整理到一個csv文檔中。當前VBA過程是: 1.打開個人CSV數據文件基於 4.流程陣列將CSV文件的內容加載到陣列而不打開文件
爲了提高效率的行數 3.關閉個別CSV文件文件到陣列的 2.加載內容代碼和處理,我希望有一種方法可以將單個CSV文件中的數據加載到數組中,而無需打開和關閉每個文件。
我使用Excel 2011 for Mac。
我有一個要求將6000個csv文件整理到一個csv文檔中。當前VBA過程是: 1.打開個人CSV數據文件基於 4.流程陣列將CSV文件的內容加載到陣列而不打開文件
爲了提高效率的行數 3.關閉個別CSV文件文件到陣列的 2.加載內容代碼和處理,我希望有一種方法可以將單個CSV文件中的數據加載到數組中,而無需打開和關閉每個文件。
我使用Excel 2011 for Mac。
無論如何,在我看來,沒有Excel的答案可以解決您的問題 - 當然不在其正常的定義範圍內。
解決它的正確方法是使用適合任務的編程語言;例如perl,甚至是命令shell,來合併這些文件。 Excel不是用於常量文件I/O,但是Perl在處理大量文件方面非常出色。我在幾分鐘內在一個相對較小的unix服務器上執行了一個類似於此的項目(合併數百萬個文件)。
您也可以使用命令shell將文件一起捕獲(cat = concatenate),如nneonneo在註釋中所示;我不能說哪個更快。 Perl肯定會花費更長的時間來編寫代碼,特別是如果你必須首先學習perl(儘管網上有很多例子)。
好吧,我假設所有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
截圖的文件夾的
截圖的代碼輸出
UPDATE
好吧,我在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
截圖文件夾的
截圖編碼輸出的
謝謝Siddharth,這看起來是一個非常全面的答案,我會測試和回覆。不勝感激! – 2013-02-18 14:50:45
嗨Siddharth,我測試了建議的代碼,並且從未輸入循環,因爲strFile具有值「」。工作簿保存在相關CSV文件的文件夾中。 – 2013-02-20 23:04:05
你不需要使用Excel來做到這一點,你可以使用Windows從命令提示符複製輸入合併:
copy *.csv mergedfilename.csv
它也會複製標題。 – 2017-10-23 13:21:47
也許只是'貓<所有的CSV文件>> one_big_csv_file'' – nneonneo 2013-02-16 07:16:15
是否所有的csv文件都採用相同的格式? – 2013-02-16 11:14:23
是的,所有的CSV格式都是相同的格式,儘管每個文件中有不同數量的行。 – 2013-02-18 14:48:38