フォローしている方々の間でCSVの取り扱いについて盛り上がっているみたいだったので(発端は吉田 拳さんのツイート?)、以前目にしたもののスルーしていたSchema.iniを用いる方法を試してみました。
※その後、独自のCsvParserクラスモジュールを試作してみました
ただし、そちらはパフォーマンスが低下してしまうため、
- 文字数制限(1セル255文字まで)
- 列数制限(最大255列まで)
という制限があっても問題なければ、こちらの方法(ADODB.Recordsetを用いてCSVファイルの内容をSELECTで取得)がいいかと思われます。
- CSV読み込み.xlsm(標準モジュールMod_ImportCsvToRangeをVBAに貼り付けたマクロ有効ワークシート)
- Schema.ini
- utf8_001.csv
- sjis_001.csv
を同じフォルダに置き、TestImportCsvToRangeプロシージャを実行すると、WorkSheet上に
こんな感じで、Schema.iniでの定義を元にしてCSVファイルが読み込まれます。
- CSVファイル毎に、各列の型を明示可能(頭に0の付いた数値を文字列として扱ったりできる)
- CSVファイル毎に設定を記述する必要あり(ワイルドカード指定などは不可)→管理が煩雑化しそう?
- VBA(ADODB)必須(Excelで普通に開いたり、PowerQueryで読み込んだりする場合には、設定は無視される)
- 最大列数が255等の制限あり
Schema.iniを半自動で作るようなツールがあればいいのかな?(予めテンプレートを作っておいて、指定フォルダ下にあるすべてのCSVファイルを指定したSchema.iniを出力、みたいな)
- ImportCsvToRange()を含む標準モジュール(Mod_ImportCsvToRange)
- テスト用標準モジュール(Mod_TestImport)
- テスト用CSVファイル(同じ内容を「utf8_001.csv」(UTF-8)/「sjis_001.csv」(Shift-JIS)でそれぞれ保存
- テスト用Schema.ini (※テスト用CSVファイルと同じところにShift-JISで保存のこと)
- Schema.ini ファイル (テキストファイルドライバー) - Open Database Connectivity (ODBC) | Microsoft Docs
- Schema.ini File (Text File Driver) - Open Database Connectivity (ODBC) | Microsoft Docs
相変わらずわかりにくいですね……。