CSVファイルをADOで扱う連載の30回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
schema.iniとSQL
前回ははschema.iniが存在することで、ADOの挙動がどう変わるかをご紹介しました。
今回はschema.iniを使った時にSQLの挙動がどう変わるのか迫ってみたいと思います。
今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。
CSV_ReaderSQL110.zip - Google ドライブ
SQLの挙動
schema.iniはCSVファイルのデータ型を指定できます。この連載では基本的にCSVファイルのデータをすべてダブルクォーテーションで括って文字列型として扱っていました。ですので、データを使って判定する場合にデータ型を変換する必要がありました。たとえば以下の回の例です。
ファイル売上.csvは以下の内容になっています。
"ID","品名","数量","支店" "1","バナナ","1","A" "2","リンゴ","5","C" "3","ミカン","3","D" "4","バナナ","2","A" "5","リンゴ","1","B" "6","リンゴ","7","D" "7","ミカン","2","C" "8","バナナ","5","B"
数量が3以上のデータを選択する際のSQLコマンドは以下でした。
SELECT * FROM [売上.csv] WHERE 3 <= CINT(数量)
ここで注目してほしいのはCINT(数量)です。数量も文字列型で記録されているので整数型になおしてから処理しています。数量の列だけダブルクォーテーションで括るのををやめればこの処理は不要ですが、ファイルを修正するのは面倒です。
そこで売上.csvと同じフォルダーにファイルschema.iniを作ってみましょう。内容は以下の様にします。
[売上.csv] ColNameHeader=True CharacterSet=932 Format=CSVDelimited Col1=ID LongChar Attribute 32 Col2=品名 LongChar Attribute 32 Col3=数量 Integer Col4=支店 LongChar Attribute 32
数量の列だけ整数型としました。これでデータ変換の必要はなくなるのでしょうか?以下のSQLコマンドを実行してみましょう。
SELECT * FROM [売上.csv] WHERE 3 <= 数量
結果は以下の様になりました。schema.iniを設定することで、データ変換の手間を減らすことができるんですね。
ID | 品名 | 数量 | 支店 |
---|---|---|---|
2 | リンゴ | 5 | C |
3 | ミカン | 3 | D |
6 | リンゴ | 7 | D |
8 | バナナ | 5 | B |
schema.iniを作成する
でも、既存のCSVファイルに対してschema.iniを1から作るのはちょっと手間ですよね。そこで、最後にschema.iniを作成するプロシージャをご紹介します。CSVファイルを指定しすると、ファイルと同じフォルダーにファイル名.iniの名前でschema.iniのひな形を作ります。データ型は文字列型(LongChar Attribute 32)を指定してありますので、必要に応じてデータ型を変更してからファイル名をschema.iniに変更して使ってください。
Sub MakeSchema_ini() Dim i As Long 'ファイルの選択 Dim fileName As String fileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", , "CSVファイルを選択してください") If fileName = "False" Then Exit Sub 'ヘッダーの読込み Dim fileNumber As Long fileNumber = FreeFile Dim headerData As String Open fileName For Input As fileNumber Line Input #fileNumber, headerData Close fileNumber 'ヘッダーの分割 Dim headerList() As String headerList() = Split(headerData, ",") 'ダブルクォーテーションの削除 For i = 0 To UBound(headerList) If Left$(headerList(i), 1) = Chr$(34) Then _ headerList(i) = Mid$(headerList(i), 2) If Right$(headerList(i), 1) = Chr$(34) Then _ headerList(i) = Left$(headerList(i), Len(headerList(i)) - 1) Next '出力ファイル名 Dim inifileName As String inifileName = Left$(fileName, Len(fileName) - 3) & "ini" 'ファイル書込み Open inifileName For Output As fileNumber Print #fileNumber, "[" & Dir$(fileName) & "]" Print #fileNumber, "ColNameHeader=True" Print #fileNumber, "CharacterSet=932" Print #fileNumber, "Format=CSVDelimited" For i = 0 To UBound(headerList) Print #fileNumber, "Col" & (i + 1) & "=" & headerList(i) _ & " LongChar Attribute 32" Next Close fileNumber End Sub
以上、CSVファイルをADOで扱ってみました!!
いかがでしたか?CSVファイルをADOで扱うと便利なんじゃないかな?と、思いついてこの連載を始めたのですが1年以上書き続ける羽目になり、本数は30本におよびました。大変勉強になりました。この連載はこれで終了となります。読んでいただいた方、ありがとうございました。また別の連載でお会いしましょう!!