CSVファイルをジャグ配列(配列の配列)に変換する
CSVファイルの内容をジャグ配列に変換する関数を紹介します。
ジャグ配列とは、以下のように1次元配列(親配列)の各要素に別の配列(子配列)が格納されている状態の配列を言います。
子配列のサイズは親配列の要素ごとで異なっていても構いません。ここが二次元配列との一番の違いです。
なお、親配列であるジャグ配列はVariant型でしか作成できません。
参照設定
ファイル操作はFileSystemObjectにて行います。FileSystemObjectはツールメニュー→参照設定 で「Microsoft Scripting Runtime」にチェックを付けることでクラスオブジェクトとして利用できます。
CSVファイルをジャグ配列に変換する関数
以下の関数は1つ目の引数のCSVファイルの内容を2つ目の引数のジャグ配列に格納します。CSVファイルは参照のみ行い、更新はしません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Sub CsvToJagArray(a_sFilePath, a_sArLine()) Dim oFS As New FileSystemObject '// FileSystemObjectインスタンス Dim oTS As TextStream '// TextStream変数 Dim sLine '// CSVファイルの行文字列 Dim iLineCount '// CSVファイル行数 Dim v '// カンマ分割後の配列 Dim i '// ループカウンタ '// 引数のファイルが存在しない場合は処理を終了する If (oFS.FileExists(a_sFilePath) = False) Then Exit Sub End If '// 最終行を取得するために追加モードで開く Set oTS = oFS.OpenTextFile(a_sFilePath, ForAppending) '// CSVファイルの行数を取得 iLineCount = oTS.Line - 1 Call oTS.Close Erase a_sArLine ReDim a_sArLine(iLineCount - 1) '// TextStreamオブジェクト作成 Set oTS = oFS.OpenTextFile(a_sFilePath) i = 0 '// ファイルループ Do While oTS.AtEndOfStream <> True '// 1行読み込み sLine = oTS.ReadLine '// カンマで文字列を分割し配列化 v = Split(sLine, ",") '// カンマ区切りの内容を配列に格納 a_sArLine(i) = v i = i + 1 Loop Call oTS.Close End Sub |
コード説明
この関数は3つの処理で構成されています。
- CSVファイル行数の取得する。
- 配列を1で取得した行数で領域確保する。
- CSVファイルを1行ずつカンマで分割して配列化(子配列)し、引数の配列に格納する。
1、2は配列の領域確保のための処理です。3がCSVファイルをジャグ配列に変換する実質的な本体処理です。
CSVファイルのループ中に配列の領域をRedim Preserveで拡張すると処理速度が低下するため、事前に領域確保しています。
1行目 | 1番目の引数にはCSVファイルのフルパスを指定します。2番目の引数には変換後の一次元配列を指定します。呼び出し元でDim xxx()の形で宣言していればOKです。 |
2~3行目 | ファイル操作用にFileSystemObjectクラスとTextStreamクラスを利用しています。前述していますが参照設定が必要です。 |
4~7行目 | 内部処理で使う変数です。6行目の変数vはSplit関数で配列になります。 |
10~12行目 | CSVファイルの存在チェックを行っています。存在しない場合は以降の処理をせずに終了します。 |
15~18行目 | 配列の要素数を特定するために、CSVファイルの行数を取得しています。追加モードでOpenTextFileメソッドを使うと書き込み位置がファイル終端に移動する特性を利用しています。ファイル行数の取得については他にも方法がありますので詳細は「VBAでファイルの行数を取得する」を参照ください。 |
20~21行目 | 引数の配列を消去し、そのあとで事前に取得したCSVファイルの行数から配列の領域を確保しています。 |
24~41行目 | CSVファイルを先頭から終端までループし、1行ずつSplit関数でカンマ区切りの配列に変換し、その配列vを配列に登録しています。 |
使い方
以下の3行のCSVファイル(a.csv)をジャグ配列に変換するサンプルです。呼び出し元では配列の初期化は不要です。
1 2 3 |
1,2,3 1,2,3,4,5 1,2,3,4 |
利用サンプルソース
1 2 3 4 5 |
Sub CsvToJagArrayTest() Dim ar() Call CsvToJagArray("C:\web\test\a.csv", ar) End Sub |
実行結果