AIで作ったCSVがExcelで文字化けする:先頭ゼロ・カンマ・改行も確認する演習

CSVを開いたとき、日本語が崩れる問題と、会員番号の先頭ゼロが消える問題は原因が違います。文字コードを直すだけでは、列の型の自動判定までは止まりません。AIに出力形式を指定し、取り込んだ後に同じ教材データを照合するところまでを一つの作業にします。

まず元ファイルを残して、症状を分ける

症状疑うもの最初の確認
日本語が別の文字に見える文字コードの解釈元の出力文字コードと、取込み時の指定
0007が7になる数値への自動変換その列を文字列として取り込んだか
メモのカンマで列がずれる引用符の処理区切り文字を含むセルが引用されているか
1セルの改行で行が増える単純な行分割CSVパーサーで読み取っているか

文字化けした状態で保存し直す前に、AIの元の出力や元CSVを残します。誤った変換で文字が置き換わってしまった後は、文字コードの指定だけで元に戻せるとは限りません。

教材に、壊れやすい値を入れておく

次の値は架空の教材です。会員番号は文字列、メモにはカンマと改行を含めます。日付に見える識別子も、変換せず文字列として保存したい値です。

列期待する値確認する理由
会員番号0007ゼロが残るか
氏名千葉日本語が残るか
識別子1-2日付などへ変換されないか
メモ会議A, B
次回確認
カンマと改行が同じセルに入るか

手作業の文字列連結よりCSVライターを使う

import csv

with open('lesson.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['会員番号', '氏名', '識別子', 'メモ'])
    writer.writerow(['0007', '千葉', '1-2', '会議A, B\n次回確認'])

with open('lesson.csv', encoding='utf-8-sig', newline='') as f:
    rows = list(csv.reader(f))
assert rows[1] == ['0007', '千葉', '1-2', '会議A, B\n次回確認']

UTF-8のBOMを付ける例です。Microsoftは、BOM付きのUTF-8 CSVや、テキスト/CSVからの取込みで正しく開く方法を案内しています。[出典1] ただし、BOMは会員番号を文字列として扱う指定ではありません。

Excelの取込みでは、文字コードと列型を別に見る

通常のダブルクリックで期待どおりにならない場合は、使っているExcelのテキスト/CSV取込みを利用します。日本語が正しく見える文字コードを選び、会員番号と識別子の列を文字列として扱う設定を確認します。Windows、Mac、Excelの版で操作名や機能は異なるため、実際の画面と公式案内に合わせてください。

取込み後は、見た目だけでなくセルの値を確認します。0007が表示されていても、表示書式でゼロを足した数値7なら、再出力したときの値が変わる可能性があります。文字列を保持したい列については、再出力したCSVも読み直します。

AIへ渡す出力依頼の例

列は会員番号・氏名・識別子・メモです。会員番号と識別子は文字列として元の値を保持してください。カンマと改行を含むセルはCSVの引用規則に従ってください。不明な値を推測で補わず、確認が必要な項目は別に示してください。

AIが指示に従ったかは、上の4つの教材値で照合します。CSV自体はExcelの列型を保存する形式ではないため、文字列として取り込む操作も必要です。複雑な型や書式を保持したい仕事では、CSV以外の形式が適するかも検討してください。

出典

Microsoft: Opening CSV UTF-8 files correctly in Excel。Python例の引用規則はPython csv公式文書を参照してください。