2013-02-16 62 views
2

我有一個要求將6000個csv文件整理到一個csv文檔中。當前VBA過程是: 1.打開個人CSV數據文件基於 4.流程陣列將CSV文件的內容加載到陣列而不打開文件

爲了提高效率的行數 3.關閉個別CSV文件文件到陣列的 2.加載內容代碼和處理,我希望有一種方法可以將單個CSV文件中的數據加載到數組中,而無需打開和關閉每個文件。

我使用Excel 2011 for Mac。

+3

也許只是'貓<所有的CSV文件>> one_big_csv_file'' – nneonneo 2013-02-16 07:16:15

+0

是否所有的csv文件都採用相同的格式? – 2013-02-16 11:14:23

+0

是的,所有的CSV格式都是相同的格式,儘管每個文件中有不同數量的行。 – 2013-02-18 14:48:38

回答

0

無論如何,在我看來,沒有Excel的答案可以解決您的問題 - 當然不在其正常的定義範圍內。

解決它的正確方法是使用適合任務的編程語言;例如perl,甚至是命令shell,來合併這些文件。 Excel不是用於常量文件I/O,但是Perl在處理大量文件方面非常出色。我在幾分鐘內在一個相對較小的unix服務器上執行了一個類似於此的項目(合併數百萬個文件)。

您也可以使用命令shell將文件一起捕獲(cat = concatenate),如nneonneo在註釋中所示;我不能說哪個更快。 Perl肯定會花費更長的時間來編寫代碼,特別是如果你必須首先學習perl(儘管網上有很多例子)。

3

好吧,我假設所有6000文件具有相同的格式。

我的測試條件

  1. 我有一個文件夾名爲C:\ TEMP \其中有6000個CSV文件
  2. 所有CSV文件有40行和16列
  3. 在Excel 2010中唐測試它沒有進入2011年。將在大約30分鐘的2011年進行測試。

我跑了下面的代碼,代碼只用了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


UPDATE

好吧,我在MAC

測試它

我的測試條件

  1. 我有一個名爲其中有1024個CSV文件
  2. 所有CSV文件有40個桌面上的示例文件夾行和16列
  3. 在Excel 2011中測試它。

我運行了下面的代碼,代碼花費的時間不到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

+0

謝謝Siddharth,這看起來是一個非常全面的答案,我會測試和回覆。不勝感激! – 2013-02-18 14:50:45

+0

嗨Siddharth,我測試了建議的代碼,並且從未輸入循環,因爲strFile具有值「」。工作簿保存在相關CSV文件的文件夾中。 – 2013-02-20 23:04:05

0

你不需要使用Excel來做到這一點,你可以使用Windows從命令提示符複製輸入合併:

copy *.csv mergedfilename.csv 
+0

它也會複製標題。 – 2017-10-23 13:21:47

相關問題