schema.iniとSQL(CSVファイルをADOで扱う㉚)

CSVファイルをADOで扱う連載の30回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org

schema.iniとSQL

前回ははschema.iniが存在することで、ADOの挙動がどう変わるかをご紹介しました。

f:id:HiroCom777:20220305132047j:plain

今回はschema.iniを使った時にSQLの挙動がどう変わるのか迫ってみたいと思います。

今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。

CSV_ReaderSQL110.zip - Google ドライブ

SQLの挙動

schema.iniはCSVファイルのデータ型を指定できます。この連載では基本的にCSVファイルのデータをすべてダブルクォーテーションで括って文字列型として扱っていました。ですので、データを使って判定する場合にデータ型を変換する必要がありました。たとえば以下の回の例です。

hirocom777.hatenadiary.org

ファイル売上.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本におよびました。大変勉強になりました。この連載はこれで終了となります。読んでいただいた方、ありがとうございました。また別の連載でお会いしましょう!!

CSVファイルをADOで扱う連載記事はコチラからどうぞ