CSVファイルに 00123 が正しく入っていても、開いた表計算ソフトでは 123 と表示されることがあります。ファイルに保存されているのはテキストのフィールドで、それをどう解釈するかは取り込むアプリケーションが決めます。識別子は取り込み時にテキストとして保持し、元のファイルを置き換える前に、保存した結果を確認してください。
識別子は必ずしも数値ではない
個数や価格のような量には計算を使います。郵便番号、カタログのキー、口座の識別子は、その意味に応じて扱ってください。それらの数字はラベルであり、足し算する量ではないことがあります。先頭のゼロ、長い数字列、日付に見えるコードは、意図しない変換によって壊れる可能性があります。
先頭のゼロと大きな数値に関するMicrosoftのガイドでは、該当する列をテキストとして取り込む方法が説明されています。また、対応するExcelのバージョンにある自動変換の制御も記載されています。実際に使っているバージョンで確認してください。同じ設定がすべてのエディションにあるわけではありません。
オリジナルの架空のCSVの例
これらは学習用に作った架空のレコードで、実在の口座や顧客のデータではありません。サンプルCSVをダウンロードする。
item_id,reference,label,quantity
00123,12345678901234567890,JAN1,7
00007,98765432109876543210,1E10,12
| 列 | 意図する意味 | 取り込み時の型 |
|---|---|---|
| item_id | 5文字の識別子 | テキスト。00123 と 00007 を保持する |
| reference | 長い参照文字列 | テキスト。すべての桁を保持する |
| label | 日付や指数ではなく、コードである | テキスト。JAN1 と 1E10 をそのまま保持する |
| quantity | 個数 | 検証後に整数とする |
CSVには、この列の型の表が、どこでも強制されるスキーマとして含まれているわけではありません。引き継ぎの指示書にこの表を入れると、別のアプリケーションが異なる解釈をするのを防ぐ助けになります。
Excelで意図的に取り込む
- 元のCSVを、変更しないままコピーして保管します。
- ダブルクリックによる自動的な推測に頼らず、アプリケーションのテキスト/CSV取り込みの手順を使います。
- プレビューを確認し、変換が適用される前に、識別子にあたる列をテキストに設定します。クエリの手順では、型を自動で変更するステップを、必要に応じて確認または置き換えます。
- 区切り文字、文字エンコード、日付に見える値の扱いを確認します。
- データを読み込み、正確な識別子を元のデータと比較します。
- エクスポートしたあとは、できあがったCSVをテキストエディタで確認し、意図した列の型で再度取り込みます。
Microsoftのテキストファイルのインポート/エクスポートの手順では、「開く」と「取り込む」の違いが説明されています。メニューの名称は、プラットフォームやバージョンによって異なります。5桁のゼロというユーザー定義の表示形式を使えば 123 を 00123 と表示できますが、それは元のテキストの識別子を保持することとは違いますし、すでに失われた桁を復元することでもありません。
Pythonで文字列を確認する
Pythonのcsvのドキュメントには、フィールドは既定で文字列として読み込まれ、変換オプションについては特定の例外があると書かれています。次の小さな確認コードは、標準ライブラリだけを使います。
import csv
with open("identifier-example.csv", newline="", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
assert rows[0]["item_id"] == "00123"
assert rows[0]["reference"] == "12345678901234567890"
assert rows[1]["label"] == "1E10"
quantities = [int(row["quantity"]) for row in rows]
assert sum(quantities) == 19
この確認では、あえて quantity 列だけを変換しています。これはサンプルファイルの内容を示すものであり、任意のエクスポートや表計算アプリケーションについての保証ではありません。
自動では復元できないもの
長い識別子がすでに丸められ、元のファイルに上書き保存されている場合は、セルの書式をテキストに変更しても、失われた桁を復元できません。変更されていない元のデータから復元してください。123 が 00123 を意味するのか 123 を意味するのか分からない場合、ゼロで埋めるかどうかは業務ルールで決めることであり、元の値の証明にはなりません。
CSVのフィールドを引用符で囲むのは、区切り文字などの文字を保持するための構文です。表計算ソフトがそのフィールドをテキストとして扱うよう、どこでも強制するものではありません。役に立つ引き継ぎ資料には、文字エンコード、区切り文字、意図する列の型、検証ルールが書かれています。文書の共有に関する関連する問題については、Wordのフォントの利用可否と移植性を参照してください。
