エラーの再現方法
同じフォルダに次のファイルを起きます
C:\hoge\とします
- sch.txt(Shift Jis 932)
- Schema.ini
- Access(*.accdb)ファイル
テキストファイル
Shift-Jis Code 932です。
今回は、NOのフィールドは01になっていますがLONGとして扱うのでインポート後は1
になります。
なお、フィールド名のNOは予約語なので、本来は使わないほうがいい(注)のですが、実態に合わせてそうしています。
"NO","F01","F02","F03"
"01",2233333.456,"nam","1,000,000"
"01",2233333.456,"na1","2,000,000"
[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
Access
test.accdb
次のようなクエリ(SQL)を書きます
SELECT * INTO T_CsvImport
FROM [TEXT;DATABASE=C:\hoge].[sch.txt];
エラー発生
テキストファイル形式のフィールド区切り記号に、桁やテキストの区切り記号と同じ記号は使用できません
原因
Schema.iniのDecimalsymbolがいらない
Schema.iniを次のように書き換えます
具体的には無効化したい行の冒頭に半角のセミコロンを追加します。
;DecimalSymbol=,
この部分です
[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
テキスト データ ソース ドライバーの初期化
DecimalSymbol 数値の整数部分と端数部分を区切るために使用する任意の 1 文字を設定できます。このエントリを省略した場合は、Windows コントロール パネルの既定値が使用されます。
つまり小数点のことですね。
このため、定義しない(既定値が使われる)か、DecimalSymbol=.
にすると解決します。
公式のサンプル自体が間違っている
[アーティクル]2021/09/26の時点だが、次のような部分がある。
データを区切り記号付きテキスト ファイルにエクスポートする場合は、そのファイルに対して同様に次の書式を指定します。
schema.ini[
[Export: My Special Export]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=25
CharacterSet=OEM
DateTimeFormat=mm.dd.yy.hh.mm.ss
CurrencySymbol=Dm
CurrencyPosFormat=0
CurrencyDigits=2
CurrencyNegFormat=0
CurrencyThousandSymbol=,
CurrencyDecimalSymbol=.
DecimalSymbol=,
NumberDigits=2
NumberLeadingZeros=0
TextDelimeter="
ここが間違っている。 DecimalSymbol=,
面倒くさいからといって公式から引っ張ってくればこれである。
ちなみに、ドイツ語とか技術系の一部の記載はコンマと小数点の関係が逆らしい。
なので、このような表記も可能性はあるが、とりあえずアクセスではエラーになる。
また通貨の部分のコンマを消す
```text:sch.txt
"NO","F01","F02","F03"
"01",2233333.456,"nam","1000000"
"01",2233333.456,"na1","2000000"
でも同じエラーが発生する。当初から2233333.456
とDoubleはコンマなしだったがエラーが発生する。
つまり定義しさえすればデータに実際に使用されているかどうかに関わらずエラーになるわけである。
英語でも資料が少ない
テキスト ファイルのデータをインポートまたはリンクする
Access データベースで特殊文字を使用する場合のエラー メッセージ
これはフィールド名でデータではない。
https://docs.microsoft.com/ja-jp/office/troubleshoot/access/error-using-special-characters
Mr Excel
"Text file specification field seperator matches decimal seperator or text delimiter"
英語はこのように書くと思われる。
Errormessage while importing .csv file into Access 2010
https://www.mrexcel.com/board/threads/errormessage-while-importing-csv-file-into-access-2010.801678/
問を発した人はSchema.iniなんて書いていないと言っているようだ。
また英語の場合は名前をコンマで区切るので問題が出るようだ
CSV with comma or semicolon?
https://stackoverflow.com/questions/10140999/csv-with-comma-or-semicolon
"NO","F01","F02","F03"
"01",2233333.456,"nam","1000000"
"01",2233333.456,"Bond, James ""master""","2000000"
上記のファイルをこんなふうに変えると、
とこのようにダブルクォーテーションが取り込まれる。
このように言語ごとに事情が異なって発生するため、英語に資料があるというわけでもないようだ。
回避策
現状での回避策はDecimalSymbolは定義しないというのが簡単で効率がいいと思われる。
小数点の定義を変更することは通常考えられないからだ。
ドイツ語のテキストファイルとか技術系でない限り定義を変更することはないと思われる。
もっともいざ変えようとするとエラーが発生してできない。
Stackoverflowはコントロールパネルで設定を変えろとか言っているようだ。
おそらくそのような根本的な変更が必要になるのだろう。
しかし常識的にそれも危険なので、まずコンマ区切りをタブ区切りに変えた上で、桁区切りを消して、小数点の区切りをピリオドに変更する、というような加工をして、読み込ませたほうがいいと思われる。
つまり不要な桁区切りはデータベース本体では使わず、見た目だけ変えるほうが良い。そうした工夫もこの場合は必要と思われる。
(注)
Access 2002 以降のバージョンの Access の予約語の一覧 mdbの場合は予約語を使うとエラーになる。
余談
なお、余談だが前にも触れたとおり、MS ACCESSのSchemna.iniは
テキスト データ ソース ドライバーの初期化
というページにある。これ自体タイトルからはわからない。
しかも、Schema.iniで検索すると必ずSQL Serverの解説に飛ばされてしまう。以下のタイトルとURLである。Versionは変わるかもしれないが。
Schema.ini ファイル (テキスト ファイル ドライバー)
https://docs.microsoft.com/ja-jp/sql/odbc/microsoft/schema-ini-file-text-file-driver?view=sql-server-ver15
URLをみれば分かる通りSQLとあるのはSQLサーバーのことであってAccesではない。UTF-8の扱いが異なるので、このページは参考にしてはいけない。