DESIGN / CODE / INFRA / AI

解説

00123を123に変えない:AIへCSVのIDを渡す前に文字列を保とう

数値に見えるIDでも先頭の0には意味がある。架空のCSVをPythonで読み、文字列のまま保つ場合と整数へ変換した場合の違いを確認。

00123を123に変えない:AIへCSVのIDを渡す前に文字列を保とう
保存リストを見る →
この記事の道しるべ 5項目

AIへCSVの一覧を整理してもらったら、IDの00123が123へ変わっていた。計算するための数なのか、記録を見分ける文字列なのかを、先に分けよう。

今回は架空の二件だけを使う。Pythonの例を実行しなくても、表から違いを読めるよ。実際の利用者の番号や郵便番号は使わない。

数字だけでも、足し算する値とは限らない

原文のID この練習での扱い
00123 一つ目の記録を見分ける文字列
123 別の記録を見分ける文字列

この例の仕様では、二つを別のIDとして扱う。数字だけで書かれていても、量や金額のような計算用の数とは違うんだ。

元のシステムが同じIDとして定義している場合もあり得るので、どちらが正しいかは仕様を確認する。見た目だけで、勝手にそろえないようにしよう。

CSVを文字列として読む例

import csv
import io

source = "id,name\n00123,りん\n123,そら\n"
rows = list(csv.DictReader(io.StringIO(source)))
print([row["id"] for row in rows])
print([int(row["id"]) for row in rows])

最初の表示は['00123', '123']。この読み方では値を文字列のまま保持している。次の整数への変換では[123, 123]となり、先頭の0という違いを失う。

Pythonのcsv.readerは、通常は各項目を文字列として返し、自動的な数値変換をしない。DictReaderも列名で値を参照するための読み方で、今回のIDは文字列のままだよ。

あとから0を足せば戻る、とは限らない

元が00123だったのか、0123だったのか、123だったのか。整数123だけからは、元の桁数を特定できない。

「5桁へそろえる」という正式なルールがある場合の処理と、失った情報を推測して戻すことを分けよう。郵便番号や商品コードなども、使う国・システムの仕様を確認する必要があるね。

AIへ渡すときの条件を明示する

id列は計算する数ではなく、記録を識別する文字列です。
先頭の0、桁数、原文の表記を保持してください。
00123と123を勝手に統合しないでください。
変更が必要そうな値は原文を残して別欄へ挙げ、推測で補正しないでください。

この依頼だけで、出力が必ず守られるとは限らない。出力後にIDを原文と文字列として照合し、件数と重複が変わっていないかを確認しよう。

表計算ソフトへ取り込む場合も確認する

CSV自体は区切ったテキストだけれど、開く側のソフトが値を数値や日付と解釈することがある。保存後の見た目だけでなく、取り込み時の列の型や、再出力した値も確認したいね。

練習では原文を別に残し、取り込み・AIへの依頼・書き出しのどの段階で変わったかを順に見よう。元ファイルを上書きしなければ、比較し直しやすいよ。

編集部ではPython 3.12で文字列の保持と整数変換を確認した。実際のAIモデルや表計算ソフトで、全パターンの変換を試した結果ではないよ。並べ替えは数字と文字列、照合はIDと表示名も参考になるね。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。