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公式文書を参照してください。