ファイルが取り込めない!
毎年のようにこんな事象で躓いている人を見かけます。バッチプログラムに問題なさそうだし、テストデータも問題ないように見えるのにエラーになると。
特定のディレクトリに格納しているテキストファイル(.txtや.csv)をDBに取り込むバッチを作りました。テストのためにデータを手作成し、バッチを起動したところプログラムに誤りは見られないし、ファイル配置の階層も正しいし、ファイルの中身(インターフェース)も問題ないように見えるのにエラーとなって取り込めません。
こんな時に確認してもらいたいのが、テキストの文字コードがUnicodeでBOM付きになっていないか。
※バッチはUTF-8(BOM無し)テキストファイルを取り込む仕様だが、肝心のファイルはUTF-8(BOM付き)になっている。
以下はBOM付きとBOM無しのファイルをWinMergeで比較したキャプチャ。
テキストデータは同じに見えるが文字コードに着目すると右側は「BOM」と書かれていることが分かります。

BOMとは?
BOM(バイトオーダーマーク)は、Unicodeで記述された文書の冒頭に記載されるものです。記載されていると言ってもテキストとして書かれているわけではないので、ファイルを開いてぱっと見で分かるようなものではありません。
BOMは、文書がUnicode文字列であることを示したり、一文字を複数バイトで表す際のバイト列の並び順(上位側が先か下位側が先か)を規定します。符号化方式によって2~4バイトのバイト列が決められており、BOMを記述しないよう規定された符号化方式もあります。
例えば、バイナリエディタでBOM付きのUTF-8のファイルを開いてみると16進数で先頭から順に「EF BB BF」と記載されています。これがBOMです。また、UTF-16ではビッグエンディアンの場合は「FE FF」、リトルエンディアンの場合は「FF FE」と記述します。UTF-32ではビッグエンディアンの場合は「00 00 FE FF」、リトルエンディアンの場合は「FF FE 00 00」がBOMとして記載されています。
Unicodeが開発された当初は使用されている符号化方式がUnicodeのものであることを明示する必要がありましたが、近年はBOMを付与しなくてもUnicodeを判別できるようになりましたので、テキストファイルにBOMを付与するケースはあまり多くありません。
BOM確認方法/BOMの外し方
BOMの確認方法:バイナリエディタを使用して上記で説明した16進数を確認する方法もありますが、もっと簡単に確認する方法です。sakuraエディタでファイルを開くと右下に文字コードとBOM有無が書かれているのでこちらで見るのがお勧めです。
BOMの外し方:sakuraエディタで「ファイル」から「名前を付けて保存」を選択するとBOMのチェックボックスが出てくるので、こちらのチェックを外すことでBOMを外すことができます。

まとめ
BOMについて理解できましたでしょうか。ぱっと見問題ないファイルに見えるのに、ジョブがファイルを取り込めない、インタフェース系のエラーになるという事があったら一度BOM有無の確認をしてみましょう。


