CSVファイルをジャグ配列(配列の配列)に変換する

CSVファイルの内容をジャグ配列に変換する関数を紹介します。

ジャグ配列とは、以下のように1次元配列(親配列)の各要素に別の配列(子配列)が格納されている状態の配列を言います。

子配列のサイズは親配列の要素ごとで異なっていても構いません。ここが二次元配列との一番の違いです。

なお、親配列であるジャグ配列はVariant型でしか作成できません。

参照設定

ファイル操作はFileSystemObjectにて行います。FileSystemObjectはツールメニュー→参照設定 で「Microsoft Scripting Runtime」にチェックを付けることでクラスオブジェクトとして利用できます。

CSVファイルをジャグ配列に変換する関数

以下の関数は1つ目の引数のCSVファイルの内容を2つ目の引数のジャグ配列に格納します。CSVファイルは参照のみ行い、更新はしません。

 

コード説明

この関数は3つの処理で構成されています。

  1. CSVファイル行数の取得する。
  2. 配列を1で取得した行数で領域確保する。
  3. 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)をジャグ配列に変換するサンプルです。呼び出し元では配列の初期化は不要です。

利用サンプルソース

実行結果