2

6000を超えるcsvファイルを1つのcsvドキュメントにまとめる必要があります。現在のVBAプロセスは次のとおりです。1。個々のCSVデータファイルを開きます2.行数に基づいてファイルの内容を配列にロードします3.個々のCSVファイルを閉じます4.配列を処理します

コードと処理の効率を向上させるために、すべてのファイルを開いたり閉じたりせずに、個々のCSVファイルから配列にデータをロードする方法があるのではないかと期待していました。

私はExcel2011forMacを使用しています。

4

3 に答える 3

3

6000 個のファイルはすべて同じ形式であると想定しています。

私の試験条件

  1. 6000 個の CSV ファイルがある C:\Temp\ というフォルダーがあります。
  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

フォルダのスクリーンショット

ここに画像の説明を入力

コード出力のスクリーンショット

ここに画像の説明を入力


アップデート

OK、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、またはコマンド シェルでさえ、ファイルを結合します。Excel は一定のファイル I/O 用には作成されていませんが、perl は大量のファイルの処理に優れています。これと同様のプロジェクト (数百万のファイルを結合する) を、比較的小さな UNIX サーバーで数分で実行しました。

nneonneo がコメントで示唆しているように、コマンド シェルを使用してファイルをまとめて cat (cat=concatenate) することもできます。どちらが速いとは言えません。Perl は、特に最初に perl を学ばなければならない場合は特に、コーディングに時間がかかります (ただし、ネット上には多くの例があります)。

于 2013-02-16T07:25:47.047 に答える