「CSVで送ってください」の落とし穴
──ファイル形式・文字コード・改行コードの実務ガイド
・CSV・TSV・JSON・XMLそれぞれの特性と使い分け
・Shift_JISとUTF-8、BOMの有無で何が起きるか
・改行コード(CR / LF / CRLF)の違いと、値の中に改行が入る問題
・区切り文字・クォート・NULL・型の自動変換という定番の罠
・クラウド基盤で使われるParquetなどの列指向フォーマット
・連携を始める前に取り決めておくべき項目
システム間でデータをやり取りするとき、最もよく交わされるやり取りがあります。
「データをいただけますか」
「はい、CSVで出力してお送りします」
この一言で話がまとまったように見えて、実際にファイルを受け取ってみると、うまく読み込めない。文字化けする。行数が合わない。数字だったはずの列が日付になっている——。データ連携の現場では、こうした問題が繰り返し起きています。
ファイルの仕様は決まりません。
本記事では、データ連携で毎回ハマるポイントを具体例つきで整理します。物流に限らず、システム間でファイルをやり取りする場面で共通して役立つ内容です。
1. まず、どの形式でやり取りするか
データファイルの形式には、いくつかの選択肢があります。それぞれ得意な場面が異なります。
| 形式 | 特徴と向いている場面 |
|---|---|
| CSV | カンマ区切りのテキスト。ほぼすべてのシステムが読み書きでき、Excelでも開ける。表形式のデータに向く。仕様の揺れが大きく、後述する罠が多い |
| TSV | タブ区切りのテキスト。住所や商品名にカンマが含まれる場合でも区切りを誤りにくい。ただし値の中にタブが入ると同じ問題が起きる |
| JSON | 階層構造を持てるテキスト形式。1件のデータに複数の明細がぶら下がるような構造を表現できる。IoT機器やWeb APIで広く使われる |
| XML | 階層構造を持てるテキスト形式。EDIや基幹システムとの連携で使われることがある。JSONよりファイルサイズが大きくなりやすい |
| Parquet | 列指向のバイナリ形式。大量データの分析基盤で使われる。テキストエディタでは開けない |
実務上は、相手のシステムが出力できる形式が最初の制約になります。基幹システムやWMSからの出力はCSVまたは固定長テキスト、IoT機器やAPIからはJSON、というのが典型的なパターンです。
2. CSVの罠——「カンマ区切り」だけでは決まらないこと
CSVは最も広く使われる形式ですが、同時に最も仕様の揺れが大きい形式でもあります。実務で問題になりやすい項目を順に見ていきます。
罠①:値の中にカンマが入る
最も古典的な問題です。住所、商品名、備考欄。これらにカンマが含まれると、列がずれます。
意図した3列のデータ
このまま読み込むと、2行目は「A001」「ボールペン(黒」「赤」「青)」「100」の5列として解釈されます。
これを防ぐのがダブルクォート(”)による囲みです。
クォートで囲んだ場合
ただし、今度は「値の中にダブルクォート自体が含まれる場合はどうするか」という問題が出てきます。CSVの一般的な取り決めでは、値の中のダブルクォートは2つ重ねて表現します。
値の中にダブルクォートがある場合
これは「15″モニタースタンド」という値を表します。この仕様に対応していない読み込み処理では、ここで破綻します。
罠②:値の中に改行が入る
備考欄や住所欄に改行が入力されているケースです。クォートで囲まれていれば1つの値として扱えますが、囲まれていない場合、そこで行が分かれてしまいます。
「送られてきたCSVの行数と、システムの登録件数が合わない」という現象の典型的な原因がこれです。件数のズレが小さいと見過ごされやすく、後から発覚することがあります。
罠③:改行コードの違い
行の区切りを表す「改行コード」には、複数の種類があります。
| 改行コード | 主に使われる環境 |
|---|---|
| CRLF(\r\n) | Windows。国内の業務システムからの出力で多い |
| LF(\n) | Linux、macOS。クラウド上のシステムで一般的 |
| CR(\r) | 古いMac環境など。現在は稀だが、既存資産で残っていることがある |
多くの読み込み処理は複数の改行コードに対応していますが、対応していない場合、ファイル全体が1行として読み込まれる、あるいは各行の末尾に余分な文字(\r)が付いたまま取り込まれる、といった現象が起きます。
後者は特に発見しにくい問題です。見た目には正常なのに、最終列の値だけが常に一致しない。「〝東京〟と〝東京〟が別の値として扱われる」といった形で現れます。
罠④:文字コード
日本語を含むデータでは、文字コードの不一致が文字化けを引き起こします。
| 文字コード | 補足 |
|---|---|
| Shift_JIS (Windows-31J / CP932) |
国内の業務システムからの出力で多い。Windows環境で拡張された文字を含むため、単純に「Shift_JIS」と指定すると一部の文字が変換できないことがある |
| UTF-8 | クラウドサービスやWeb APIで標準的。多言語の文字を扱える |
| UTF-8(BOM付き) | ファイル先頭に3バイトの識別子が付く。Excelで開いたときに文字化けを避けやすい一方、BOMを想定していない処理では先頭の列名に余分な文字が混ざる |
特に注意したいのが、一部の文字だけが化けるケースです。丸数字(①②)、ローマ数字(ⅠⅡ)、環境依存の漢字(﨑、髙など)。これらは文字コード間で対応が取れないことがあり、大半のデータは正常に見えるため、問題の発見が遅れます。
罠⑤:NULL・空文字・ゼロの区別
CSVはテキストファイルなので、「値が存在しない」ことを表現する方法が決まっていません。
| 書き方 | 受け取る側の解釈 |
|---|---|
| A001,,100 | 空文字なのか、値なし(NULL)なのか判別できない |
| A001,””,100 | 空文字として扱われることが多いが、処理系による |
| A001,NULL,100 | 「NULL」という4文字の文字列と解釈される可能性がある |
| A001,0,100 | 数値のゼロ。「未計測」の意味で0を入れると集計を誤る |
この区別は、集計結果に直接影響します。「未計測」を0として集計すれば平均値が下がりますし、欠損として除外すれば分母が変わります。どう表現するかを送信側と受信側で合意しておく必要があります。
罠⑥:Excelによる型の自動変換
CSVをExcelで開いて確認・編集し、そのまま保存する——この運用は、意図しないデータ変換を引き起こします。
| 元の値 | Excelで開いて保存した後 |
|---|---|
| 0012 | 12(先頭のゼロが失われる) |
| 1-2 | 日付として解釈されることがある |
| 4901234567894 | 指数表記(4.90123E+12)に変換されることがある |
| 001-2345 | 書式によっては先頭ゼロが失われる |
商品コード、JANコード、電話番号、部屋番号。桁を保持したい数字列は、すべてこの影響を受け得ます。データ連携の経路にExcelでの手作業が挟まっている場合は、この点を確認しておく価値があります。
もう一つ見落とされやすいのが日付・時刻の書式変換です。Excelは日付として認識した値を、セルの表示形式に従って書き換えます。「2026/08/17」と入力されていた値が、保存後に「2026-08-17」や「8/17/2026」、あるいは「2026年8月17日」になっていることがあります。
取り込む側のシステムは、多くの場合日付の書式を1つに固定して受け付けます。たとえば日付は「YYYY/MM/DD」、日時(タイムスタンプ)は「YYYY-MM-DD HH:MM:SS」というように、項目の種類ごとに異なる書式が指定されることもあります。Excelを経由すると、この書式が意図せず変わってしまいます。
罠⑦:ヘッダ行と項目の並び
1行目が項目名(ヘッダ行)なのかデータなのか。項目の並び順は固定なのか、ヘッダ名で判断するのか。項目が追加されたとき、末尾に足すのか途中に挿入するのか。
これらは連携開始時には問題になりませんが、数か月後にシステム改修で項目が1つ増えたときに顕在化します。列の並び順で判断する処理は、途中に列が挿入された瞬間に全体がずれます。
3. JSON・XMLという選択肢
CSVの罠の多くは、「表形式のデータを、区切り文字だけで表現しようとしている」ことに由来します。JSONやXMLは、値の範囲を明示的に示す構造を持つため、これらの問題の一部を回避できます。
JSONの例
値がどこからどこまでかが明確で、カンマが含まれていても問題になりません。また、1件の出荷に複数の明細がぶら下がるといった階層構造をそのまま表現できます。CSVで同じ構造を表そうとすると、ヘッダ用と明細用の2ファイルに分けるか、明細ごとにヘッダ情報を繰り返すことになります。
JSONを使う場合の注意点
JSONは文字コードとしてUTF-8を用いるのが一般的で、この点では迷いが少なくなります。一方で、注意すべき点もあります。
ファイル全体が1つの構造になる。 1件でもデータが壊れていると、ファイル全体が読み込めなくなることがあります。これを避けるため、1行に1件のJSONを並べる形式(JSON Lines / NDJSON と呼ばれます)が使われることもあります。
数値の扱いに注意が必要。 先頭にゼロが付くコードや、桁数の大きい数値は、数値型ではなく文字列型(クォートで囲む)として扱うのが安全です。
ファイルサイズが大きくなりやすい。 1件ごとに項目名が繰り返されるため、同じ内容のCSVより大きくなります。
XMLが使われる場面
XMLもJSONと同様に階層構造を表現できます。JSONより記述が冗長になりますが、EDI(電子データ交換)の標準や、一部の基幹システムとの連携で採用されていることがあります。連携相手がXMLを指定してきた場合は、その仕様に合わせることになります。
4. 分析基盤で使われるParquet
ここまでは、システム間でやり取りするファイル形式の話でした。一方、クラウドの分析基盤にデータを蓄積する段階では、別の形式が使われることがあります。その代表がApache Parquetです。
行指向と列指向の違い
CSVは行指向——1件のデータをまとめて記録していく形式です。1件ずつ読み書きする用途に適しています。
これに対してParquetは列指向——同じ列の値をまとめて記録します。「出荷日」の列だけ、「数量」の列だけ、というようにデータが並びます。
| 項目 | CSV(行指向) | Parquet(列指向) |
|---|---|---|
| 得意な処理 | 1件ずつの追加・参照 | 特定の列だけを対象とした集計 |
| ファイルサイズ | 圧縮しない場合は大きい | 同じ列に似た値が並ぶため圧縮が効きやすい |
| 型の情報 | 持たない(すべて文字列として記録) | 列ごとにデータ型を保持する |
| 可読性 | テキストエディタで開ける | バイナリ形式のため専用のツールが必要 |
「1年分の出荷データから、月ごとの数量合計を出す」といった集計では、必要な列だけを読めば済むため、列指向のほうが効率的に処理できます。大量のデータを扱う分析基盤でParquetが採用されるのは、この特性によるものです。
5. 連携を始める前に取り決めておくこと
ここまで挙げた問題の多くは、事前の取り決めで防げます。実際、データを受け入れる側のシステムでは、取り込み時の挙動がこうした項目ごとに設定されているのが一般的です。「CSVで」の一言で済ませず、以下を確認しておくと後の手戻りを大きく減らせます。
ファイルの基本仕様
| 確認項目 | 取り決めの例 |
|---|---|
| ファイル形式・拡張子 | CSV / TSV / JSON のいずれか。拡張子(.csv など)も明記する |
| 圧縮の有無 | 圧縮なし、または zip / gzip のいずれか |
| 文字エンコーディング | UTF-8 とする |
| BOMの扱い | BOMを付けるか。付ける場合、取り込み側でスキップされるか |
| 改行コード | CRLF(\r\n)または LF(\n)のいずれかに統一する |
| 区切り文字 | カンマ(,)またはタブ |
| ファイル名 | 命名規則、日付の付与方法 |
行と列の扱い
| 確認項目 | 取り決めの例 |
|---|---|
| ヘッダ行の有無 | 1行目を項目名とするか。項目の追加時は末尾に追加する等のルールも決める |
| 列名の照合方法 | ヘッダ名で照合するか、列の並び順で照合するか。ヘッダ名で照合する場合、大文字・小文字を区別するか |
| 列数の不一致 | 列数が想定と違う行を検出したときエラーとするか、読み飛ばすか |
| 空行の扱い | 空行をスキップするか、エラーとするか。ファイル末尾の改行の有無も確認する |
値の表現
| 確認項目 | 取り決めの例 |
|---|---|
| 囲み文字(クォート) | 使用しないか、ダブルクォートで囲むか。使う場合、全項目を囲むか必要な項目のみか |
| エスケープの方法 | 値の中に区切り文字・囲み文字・改行が含まれる場合の表現方法。囲み文字を使わない運用なら、そもそもこれらの文字を値に含めない取り決めが必要 |
| 前後の空白 | 値の前後にある空白を除去(トリム)するか、そのまま保持するか |
| NULL・空値の表現 | 空文字とするか、特定の文字列を用いるか。空のフィールドをNULLとして扱うかどうかも決める |
| 無効な文字の扱い | 文字コードとして解釈できない文字が現れた場合、置換するかエラーとするか |
データ型ごとの書式
| 確認項目 | 取り決めの例 |
|---|---|
| 日付の書式 | YYYY/MM/DD または YYYY-MM-DD のいずれかに統一する |
| 日時(タイムスタンプ)の書式 | YYYY-MM-DD HH:MM:SS など。タイムゾーンを含めるかどうかも決める |
| 時刻のみの書式 | 時刻だけの項目を使うか。使う場合の書式(HH:MM:SS など) |
| 数値項目 | 単位、小数点以下の桁数。桁を保持したいコードは数値ではなく文字列として扱う |
| バイナリ値の表現 | バイナリを含む場合、16進数(HEX)表記など、テキストで表す方法を決める |
| 件数の検証 | 件数を記載した行やファイルを併せて送るか |
※ 実際に必要な項目は連携する内容や受け入れ側のシステムによって異なります。上表は取り決めの出発点として参照してください。
まとめ:仕様を決めることが、データ連携の実務
データ連携で発生する問題の多くは、高度な技術課題ではありません。「CSVで」という言葉が指す内容が、送る側と受け取る側で違っていた——という取り決めの問題です。
文字コード、改行コード、クォート、値なしの表現。一つひとつは細かい項目ですが、これらを最初に確認しておくかどうかで、その後の作業量が大きく変わります。
技術的に難しいからではなく、
決めるべきことを決めていないからです。
重要なのは、データを集めること自体ではなく、最終的にどのKPIを改善するために、どのデータを収集するかを決めることです。Nexa Warehouse-Optimizerは、収集したデータをKPIとして可視化し、改善サイクルにつなげる分析基盤です。データ収集の構成設計からご相談いただけます。
お問い合わせはこちら