前提条件
ACCESS テキストファイル形式のフィールド区切り記号に、桁やテキストの区切り記号と同じ記号は使用できません
この設定を使いまわします。
なお、ファイル形式はmdbではなくaccdbとします。
"NO","F01","F02","F03"
"01",2233333.456,"nam","1000000"
"01",2233333.456,"Bond, James ""master""","2000000"
ここでSchema.iniを次のように表記します。
[sch.txt]
ColNameHeader=True
Format=CSVDelimited
MaxScanRows=25
CharacterSet=ANSI
CurrencyThousandSymbol=,
CurrencyDecimalSymbol=.
DecimalSymbol=.
TextDelimeter="
NumberLeadingZeros=True
Col1=[NO] LONG
Col2=[F01] Double
Col3=[F02] Text Width 30
Col4=[F03] Currency
SQL
SELECT * INTO T_CsvImport
FROM [TEXT;DATABASE=C:\hoge].sch.txt;
実行すると
なんとフィールド名に半角のカッコ()がついていることがわかります。
さらに
それではSchema.iniを次のように書きます。
[sch.txt]
ColNameHeader=True
Format=CSVDelimited
MaxScanRows=25
CharacterSet=ANSI
CurrencyThousandSymbol=,
CurrencyDecimalSymbol=.
DecimalSymbol=.
TextDelimeter="
NumberLeadingZeros=True
Col1="[NO]" LONG
Col2="[F01]" Double
Col3="[F02]" Text Width 30
Col4="[F03]" Currency
この場合どうなるか
SQLを実行してみます。
同じようにフィールド名にカッコがつく
なんと二重引用符の有無に関わらずカッコがついてしまいました。
ポイント
まずなぜ角かっこで包んだかというと、
Access 2002 以降のバージョンの Access の予約語の一覧
予約語を含む名前を持つ既存のオブジェクトの場合は、オブジェクト名を角かっこ ([ ]) で囲み、エラーを回避できます
というのがあり、
この予約語の中にNO
があるため、角かっこ[]
でエラーを回避しようとしたためでした。
なお、角かっこ[]
英語ではブランケットとも言いますが、これ自体はフィールド名に使えずエラーになるとされています。
Access データベースで特殊文字を使用する場合のエラー メッセージ
フィールド名に角かっこ ([]) またはかっこ (()) が含まれている場合は、次のエラー メッセージが表示されます。
入力した式には、閉じるかっこ、かっこ (])、または垂直バー (|) がありません。
次に、Schma.iniのフィールド名は二重引用符は必ずしも必要ではありません。しかし、空白があるとエラーが起きるため、二重引用符で回避しsています。
なお、accdb形式では上記の予約語は使ってもエラーになりません。これは誤解していたのですが、よく見ると、
難易度: 低シングル ユーザー コンピューターのユーザー インターフェイスに関する知識が必要です。 この記事は、Microsoft Access データベース (.mdb) と Microsoft Access プロジェクト (.adp) に適用されます
とあります。つまり、accdbファイルではエラーにならないわけです。その代わりブランケットが勝手に変換されているという自体になっているわけです。
ここまではいいのですが、ブランケットを使っていたらエラーではなく勝手に変換しているという点が最大のポイントです。
これは予期しない動作としていいと思います。
なぜかというとフィールド名に使えない文字を使い、さらに、テキストファイルのフィールド名と一致していないからです。
本来なら一口も食べずにエラーになって当たり前のはずです。
そうした予想を裏切るので、予期しない動作といえるわけです。
なお、SChema.iniのcsv変換で下手を打つと、Accessは強制終了します。なので、このへんはあまりAccessを試すような行為はやめたほうがいいと思います。
フィールド、コントロール、オブジェクトに名前を付けるためのガイドラインを守りましょう。