CSVとJSONを相互変換してデータを壊さない方法
CSVは、1行に1件のレコードを、区切り文字(通常はカンマ)で項目に分けて並べたプレーンテキストの表です。項目に区切り文字、ダブルクォート、改行が含まれると崩れます。読み手が構造と内容を区別できなくなるからです。引用符のルールに従い、区切り文字と見出し行を確認し、先頭にゼロのある数値は文字列として扱ってください。この記事の残りの部分では、往復変換で保てることと保てないことを説明します。
CSV→JSON変換CSVをJSONに、またはJSONをCSVに無料で使うCSVファイルとは
CSVには単一の公式な規格がありませんが、一般的な形式はRFC 4180に記述されており、多くの読み込みツールがこれに従っています。その中核となるルールは次のとおりです。
- 各レコードは独自の行に置かれ、RFCでは行末はキャリッジリターンとラインフィード(CRLF)と定められています。
- 項目はカンマで区切ります。
- カンマ、ダブルクォート、改行を含む項目は、ダブルクォートで囲みます。
- 引用符で囲まれた項目の中のダブルクォートは、ダブルクォート2つで表します。
したがって、1001,"Smith, Ann",02134 という行には3つの項目があります。引用符の中のカンマは内容の一部だからです。すべてのカンマで分割すると4つになってしまいます。fixmintのリーダーはこれらのルールを適用します。引用符で囲まれた項目には、区切り文字、改行、重ねられた引用符を含められます。閉じられていない引用符は、その開始行とともに報告されます。
区切り文字が変わる理由
カンマはRFCの既定値ですが、カンマが小数点として使われる場合(1,5は1.5を意味します)、表計算ソフトはCSVをセミコロンで保存することがよくあります。タブ区切りのファイル(TSV)は、テキストの中にタブがほとんど現れないため、多くのデータでこの衝突を避けられます。
区切り文字のメニューには、自動、カンマ、セミコロン、タブ、パイプがあります。「自動」は最初の10行を読み、引用符の外側にある各候補の出現数を数えて、1行あたりの数が最も一定しているものを選びます。自動の判定が外れた場合は、自分で区切り文字を選んでください。
fixmintで変換する
以下の例は、CSV→JSON変換ツールの既定の設定を使っています。
変換例
「1行目はヘッダー」にチェックを入れた状態で、次のCSVを貼り付けます。
id,name,zip,note
1001,"Smith, Ann",02134,"She said ""hi"""
1002,Bo,10001,"line one
line two"
「数値を変換」をオフ、JSONのインデントを2スペースにすると、ツールは次の結果を返します。
[
{
"id": "1001",
"name": "Smith, Ann",
"zip": "02134",
"note": "She said \"hi\""
},
{
"id": "1002",
"name": "Bo",
"zip": "10001",
"note": "line one\nline two"
}
]
「数値を変換」をオンにすると、idと zip の 10001 は数値になり、02134 は文字列のまま残ります。
手順
- CSVを貼り付けるか、.csv、.tsv、.txt、.jsonファイルをドロップします。
- 「1行目はヘッダー」、区切り文字、「数値を変換」を確認します。JSONのインデントは2スペース、タブ、または圧縮から選びます。
- 結果を「コピー」するか、.jsonファイルとしてダウンロードします。
数値は文字列として保つ
JSONの数値には先頭のゼロを付けられないため、02134は有効なJSON数値ではありません。郵便番号、電話番号、商品コードは文字列のまま残さないと、先頭のゼロが消えてしまいます。「数値を変換」をオンにすると、ツールは10001を数値に変換しますが、02134は文字列として残します。このオプションは既定ではオフです。変換されるのは小数点としてドットを使う値だけなので、セミコロン区切りのファイルにある1,5は入力どおりのまま残ります。
長い識別子にも注意が必要です。ブラウザ内のJSONの多くを扱うJavaScriptは、数値を64ビット浮動小数点数として保持します。整数を正確に扱えるのは9,007,199,254,740,991(2の53乗から1を引いた値)までです。JavaScriptのプログラムが12345678901234567890を読み込むと、12345678901234567000になります。ツールは数字を入力どおりに書き出しますが、JavaScriptでJSONを解析するプログラムは丸めてしまいます。IDは文字列として保存してください。JSON整形ツールも、そのような数値を入力どおりに保持し、保持した件数を表示します。
ネストしたJSONとCSVへの逆変換
CSVは平坦な構造で、JSONは入れ子にできます。JSONをCSVに変換すると、すべてのオブジェクトにわたって、キーごとに1つの列が作られます。列の順序は、各キーが最初に現れた順です。入れ子のオブジェクトやリストは、JSONテキストとしてセルに入ります。nullは空のセルになり、trueとfalseは単語として書き出されます。行はCRLFで結合され、項目は区切り文字、引用符、改行、または両端の空白を含む場合にのみ引用符で囲まれます。
[ または { で始まる入力はJSONとして読み込まれます。チップのボタンで変換方向を切り替えられ、ラベルは「CSV → JSON」または「JSON → CSV」です。「JSON → CSV」の方向では、出力オプションに区切り文字のメニューと「Excel向け」オプションが表示されます。
往復変換では情報が失われます。nullと空文字列はどちらも空のセルになり、入れ子の構造は元に戻りません。構造を残す必要がある場合は、元のJSONを保存しておいてください。
Excel、UTF-8、バイトオーダーマーク(BOM)
CSVファイルはバイト列であり、読み込み側は文字コードを知っている必要があります。UTF-8はアクセント付きの文字や他の文字体系を保持できます。バイトオーダーマーク(BOM)は、ファイルの先頭にある3バイトで、そのファイルがUTF-8であることを示します。BOMがないと、一部の表計算ソフトはファイルを地域の文字コードとして読み込むため、アクセント付きの文字が意味不明な文字に化けます。また、表計算ソフトはCSVを開くとき、02134を2134に変換してしまうことがよくあります。
「Excel向け」オプションは、ダウンロードするCSVにだけバイトオーダーマークを付けます。コピーしたテキストには付けず、「JSON → CSV」の方向でのみ働きます。読み込み側は入力からバイトオーダーマークを取り除くため、すでにBOMが付いているファイルでもエラーなく変換できます。
特殊なケース
- 行の長さが不揃い。 見出し行がオンの場合、短い行は空の値で埋められ、長い行の余分な値はcolumn_Nとして残ります。結果には、見出し行と異なる行の数が表示されます。
- 見出しの重複や空欄。 同じ名前が重複する場合は_2、_3のように番号が付けられ、空の名前はcolumn_Nになります。どちらの変更も、2つのキーが互いに上書きされるのを防ぎます。
- カーリークォート。 ワープロソフトのスマートクォートはCSVの引用符ではないため、“Smith, Ann”のような項目はカンマで分割されてしまいます。先に貼り付けテキストを整えるで、またはカーリークォートのガイドに書かれた方法で、まっすぐな引用符に直してください。
- 引用符の中の改行。 2行にまたがる項目は1つのレコードですが、重複行を削除は入力をすべての改行で分割するため、2つの半分を別の行として扱ってしまいます。JSONに変換してオブジェクトを比べるか、手作業で確認してください。重複行を削除ツールは、1行に1つの値があるリストには引き続き役立ちます。
- 大きなファイル。 結果欄には最初の100,000文字が表示されますが、「コピー」とダウンロードには出力全体が含まれます。
- 不正なJSON。 変換ツールは、エラーの行と列を、該当文字の下にキャレット(^)を付けて報告します。JSON整形ツールはよくあるミスを説明し、JSONエラーのガイドでより詳しく扱っています。
区切り文字が問題になる前に、項目の前後にある余分な空白、ファイル中央の空行、一貫しない引用符が、CSVの問題の大半を引き起こします。まずCSV・Excelのデータ整形で整えてから、変換してください。
英語原文をもとに、AIの支援を受けて翻訳しています。
コメント
まだコメントはありません。最初のコメントを書いてみましょう。


