CSV → シート → 配列 → CSV に変換して確認
CSV → シート → 配列 → CSV と順番に変換して、元のCSVに戻っているか確認しました。
Sub CSVtoSheetToArrayToCSV()
' 【Step 1】CSVファイルをExcelシートに読み込む
Dim fileName As String
' 読み込むCSVファイルのフルパスを指定
fileName = "C:\TEMP\sample2.csv"
' Power Queryを使用してCSVを"csvList"シートに読み込む
Call csv_to_sheet_PowerQuery(fileName)
' 【Step 2】Excelシートのデータを配列に変換する
Dim arr As Variant
' シート"csvList"からデータを配列へ格納する
' 第3引数に1を指定して1行目をスキップ(ヘッダー行を除外)
Call sheet_to_array("csvList", arr, 1)
' 【Step 3】配列のデータを新しいCSVファイルに書き出す
fileName = "C:\TEMP\サンプル出力PQ.csv"
' 配列のデータを指定されたパスにCSV形式で保存
Call array_to_csv_Excel_r1(arr, fileName)
End Sub
各プロセスの詳細
【Step 1】CSVファイルをExcelシートに読み込む
- 使用されている
csv_to_sheet_PowerQuery
は、Power Queryを利用してCSVファイルを指定したExcelシートに取り込むサブプロシージャ。 fileName
変数に読み込むCSVファイルのパスを指定して渡します。- 詳細な動作は、
csv_to_sheet_PowerQuery
プロシージャ内で定義されています。以下参照。
【Step 2】Excelシートのデータを配列に変換する
sheet_to_array
は、指定されたシートのデータを配列に変換するサブプロシージャ。- 第3引数に
1
を渡すことで、配列に格納する際にシートの1行目をスキップします。これにより、ヘッダー行を除外してデータのみを処理できます。 sheet_to_array
は、以下参照。
【Step 3】配列のデータを新しいCSVファイルに書き出す
array_to_csv_Excel_r1
は、配列内のデータを指定されたパスにCSV形式で保存するサブプロシージャ。- 配列からCSV形式への変換やファイル書き出し処理がこのプロシージャ内で行われます。
array_to_csv_Excel_r1
は、以下参照。
処理時間
処理時間を測定するため、マクロを以下に変更しました。
Sub CSVtoSheetToArrayToCSV()
' 処理時間測定
Dim 開始時刻 As Double
開始時刻 = Timer
Dim clm As Long
clm = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column + 1
Dim rw As Long: rw = 1
Sheet1.Cells(rw, clm) = "処理時間"
rw = rw + 1
' 【Step 1】CSVファイルをExcelシートに読み込む
Dim fileName As String
' 読み込むCSVファイルのフルパスを指定
' 15,345kB、26531行、65列
fileName = "C:\TEMP\重いファイル.csv"
' Power Queryを使用してCSVを"csvList"シートに読み込む
Call csv_to_sheet_PowerQuery(fileName)
' 処理時間測定
Sheet1.Cells(rw, clm) = (Timer - 開始時刻)
rw = rw + 1
' 【Step 2】Excelシートのデータを配列に変換する
Dim arr As Variant
' シート"csvList"からデータを配列へ格納する
' 第3引数に1を指定して1行目をスキップ(ヘッダー行を除外)
Call sheet_to_array("csvList", arr, 1)
' 処理時間測定
Sheet1.Cells(rw, clm) = (Timer - 開始時刻)
rw = rw + 1
' 【Step 3】配列のデータを新しいCSVファイルに書き出す
fileName = "C:\TEMP\サンプル出力PQ.csv"
' 配列のデータを指定されたパスにCSV形式で保存
Call array_to_csv_Excel_r1(arr, fileName)
' 処理時間測定
Sheet1.Cells(rw, clm) = (Timer - 開始時刻)
rw = rw + 1
End Sub
15,345kB、26531行、65列の CSVファイルを処理した結果が以下です。平均で、16秒程度で処理できました。
速度的にも問題なく、万能の処理方法です。配列に入れた段階で処理して、処理された配列を、CSV に変換する方法で、マクロを組むことで、高速処理が可能になります。ぜひ、試してみてください。