ExcelでUTF-8のCSVを作り、別のシステムやツールに取り込むと「1列目の列名が見つからない」と表示されることがあります。2列目以降は問題なく読めているのに、先頭の項目だけ一致しない状態です。この場合は、ファイルの先頭に付いているBOM(バイトオーダーマーク)が原因かもしれません。

この記事では、Excelの「CSV UTF-8」で保存したファイルからBOMを外し、BOMなしのUTF-8として保存し直す手順を説明します。外した後に確認する点もまとめています。

前提:Excelの「CSV UTF-8」はBOM付きで保存される

Excelの保存形式「CSV UTF-8 (コンマ区切り) (*.csv)」で保存すると、ファイルの先頭にBOMが付きます。保存画面には、BOMの有無を選ぶ項目がありません。

UTF-8のBOMは EF BB BF という3バイトです。画面には表示されませんが、ファイルの先頭、つまり1列目の列名の直前に入っています。

BOMがあることを想定していない取り込み先は、この3バイトを列名の一部として読み込みます。その結果、次のようなことが起きます。

  • 1列目の列名が「ID」ではなく「(見えない文字)ID」として扱われ、列名が一致しない
  • エラー画面やログで、1列目の列名の前に  や \ufeff のような文字が付いて見える
  • 2列目以降は取り込めるのに、1列目だけ「必須項目がない」と判定される

1列目だけがおかしく、2列目以降は正常に読めているなら、まずBOMを疑ってください。

一方で、BOM付きのファイルをそのまま読める取り込み先や、BOM付きを推奨している取り込み先もあります。BOMを外すのは、取り込み先の仕様書やエラー内容から「BOMなしが必要」と分かった場合だけにしてください。

手元のファイルにBOMが付いているか確認する

外す前に、本当にBOMが付いているかを確かめます。

確認方法 見るところ
Windows 11のメモ帳 画面下のステータスバーの文字コード表示(「UTF-8 (BOM 付き)」か「UTF-8」か)
Visual Studio Code 画面右下のステータスバー(「UTF-8 with BOM」か「UTF-8」か)
PowerShell ファイルの先頭のバイトが EF BB BF か

メモ帳でステータスバーが見えないときは、「表示」メニューからオンにします。表示される名称はアプリのバージョンによって異なる場合があります。お使いの環境の画面で確認してください。

PowerShellでは、次のコマンドでファイルの先頭16バイトを表示できます。

Format-Hex -Path "C:\work\output.csv" | Select-Object -First 1

表示されたバイトが EF BB BF で始まっていればBOM付きです。列名の文字(たとえば「ID」なら 49 44)から始まっていればBOMなしです。

BOMを外して保存し直す

メモ帳を使う(Windows 11)

ほかのソフトを入れなくてもできる方法です。

  1. Excelで「CSV UTF-8 (コンマ区切り)」として保存し、そのファイルをExcelで閉じる
  2. 保存したCSVを右クリックし、「プログラムから開く」でメモ帳を選ぶ
  3. 「ファイル」→「名前を付けて保存」を開く
  4. 画面下の「エンコード」で「UTF-8」を選ぶ(「UTF-8 (BOM 付き)」ではない方)
  5. ファイル名と保存場所を確認して保存する

元のファイルを残したい場合は、手順5で別の名前を付けて保存します。取り込み先がファイル名を決めている場合は、最後にその名前に合わせてください。

テキストエディタを使う

多くのテキストエディタでは、保存するときにBOMの有無を選べます。

  • Visual Studio Code:右下の文字コード表示をクリック →「エンコード付きで保存」→「UTF-8」を選ぶ
  • サクラエディタ:「名前を付けて保存」の画面で文字コードセットを「UTF-8」にし、「BOM」のチェックを外して保存する

メニューの名前や場所はバージョンによって変わることがあります。見つからない場合は、使っているエディタのヘルプで「BOM」や「エンコード」を検索してください。

PowerShellを使う(同じ作業を繰り返す場合)

毎日や毎月同じCSVを作る場合は、手作業よりも処理を固定したほうがミスを減らせます。次の例では、BOM付きUTF-8のファイルを読み込み、BOMなしのUTF-8で別のファイルに書き出します。元のファイルは変更されません。

$src = "C:\work\output.csv"
$dst = "C:\work\output_nobom.csv"
$text = [System.IO.File]::ReadAllText($src, [System.Text.Encoding]::UTF8)
$enc = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllText($dst, $text, $enc)

UTF8Encoding($false) の $false が「BOMを付けない」という指定です。Set-Content や Out-File は、PowerShellのバージョンによって既定の文字コードが違います。そのため、ここでは.NETのメソッドを使って文字コードをはっきり指定しています。書き出したファイルは、前の節の方法でBOMが外れているか確認してください。

外した後に確認すること

BOMを外したファイルは、取り込む前に次の点を確認します。

  • ステータスバーやFormat-Hexで、BOMなしのUTF-8になっている
  • 1列目の列名が、取り込み先の指定と完全に一致している(前後の空白、全角・半角を含めて)
  • 行数が元のファイルと同じ(エディタの最終行の行番号などで比べる)
  • 先頭の0が必要なコードや日付の列が、意図どおりの形で書かれている
  • 改行コードが取り込み先の指定(CRLFかLFか)と合っている
  • 取り込み先で、まず数行だけのテスト用ファイルを取り込んで結果を確認した

BOMを外しても、ファイルの中身の文字は変わりません。ただし、Excelで保存した時点で、先頭の0が消えたり日付の表示が変わったりしていることがあります。BOMを外したついでに、エディタで中身も確認しておきましょう。

改行コードについて補足します。WindowsのExcelが書き出すCSVの改行は、通常CRLFです。BOMを外す作業では改行コードは変わりません。取り込み先がLFを求めている場合は、BOMとは別に改行コードの変換が必要です。

BOMを外したファイルはExcelで上書きしない

BOMなしUTF-8のCSVをダブルクリックしてExcelで開くと、日本語が文字化けして表示されることがあります。BOMがないと、ExcelがUTF-8のファイルだと判断できない場合があるからです。

さらに、その状態のままExcelで上書き保存すると、文字コードが変わったり、BOMがまた付いたりします。BOMを外すのは「Excelでの編集がすべて終わった後の最後の工程」と決めておきましょう。外した後のファイルはExcelで上書き保存しないでください。中身を見たいときはテキストエディタで開くか、コピーを作ってからExcelで開くと安全です。

作業の順番は、次のように固定しておくと迷いません。

  1. Excelで元データ(xlsx)を編集する
  2. 「CSV UTF-8」で書き出す
  3. BOMを外す(メモ帳、エディタ、PowerShellのどれか)
  4. エディタで中身を確認する
  5. 取り込み先に渡す

修正が必要になったら、BOMなしのCSVを直接直すのではなく、1のxlsxを直してから2〜5をやり直します。

BOMを外しても1列目が読めないとき

BOMを外しても1列目の列名が一致しない場合は、BOM以外の原因を確認します。

  • 列名の前後に空白やタブが入っていないか
  • 列名の全角・半角、大文字・小文字が取り込み先の指定と同じか
  • 1行目が列名の行か(タイトル行や空行が先頭に入っていないか)
  • 取り込み先が求めている区切り文字がカンマか(タブ区切りなどを指定されていないか)

日本語が文字化けしている場合は、BOMとは別の問題です。文字コードそのものの切り分けとして確認してください。

おすすめの記事