CSVをJSONに変換
区切り文字の自動判定、引用符付きフィールド、郵便番号を壊さない型推論。
CSV
JSON
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
CSVを、ヘッダー行をキーとするJSONのオブジェクト配列に変換します。区切り文字は自動判定し、カンマや改行を含むクォート付きフィールドも処理し、重複する列名は捨てずにリネームします。
型推論は既定でオフです。これは意図的な設定です。
なぜ、指示があるまで値をすべて文字列として扱うのか
CSVコンバーターがデータを壊すのは、型推論の部分です。CSVには型がないため、コンバーターは推測するほかなく、その推測は気づきにくい形で外れます。
007は7になり、郵便番号が消えます。1234567890123456789と書かれた電話番号はJavaScriptの数値が保持できる範囲を超え、別の値になって返ってきます。1E5のような製品コードは100000になります。NAという値は、ある行では文字列になり、別の場所では列のヘッダーになります。
だから既定は文字列です。データの中身が分かっているときに推論を有効にしてください。なお有効にした場合でも、先頭のゼロは保持され、float64の往復に耐えない値は文字列のまま残ります。
みんながつまずくCSVの規則
- クォート
- RFC 4180の規則です。カンマ、引用符、改行を含むフィールドはダブルクォートで囲み、内部の引用符は2つ重ねます。このパーサーは複数行のフィールドも含めて正しく読み取ります。
- 区切り文字
- カンマ、セミコロン、タブ、パイプを、先頭の数行についてクォートの外側での出現回数を数えて自動判定します。ヨーロッパ版のExcelはセミコロンで書き出します。
- 重複したヘッダー
- JSONのオブジェクトは重複キーを持てないため、繰り返された列名には接尾辞を付け、その変更を報告します。片方を捨てるのは、黙ってデータを失うことです。
- 長さの揃わない行
- ヘッダーよりフィールドが少ない行にはnullを入れ、多い行では余りを_extraキーの下に残します。どちらも黙って揃えるのではなく、行番号とともに報告します。
- バイトオーダーマーク
- 取り除いたうえで報告します。残したままだと最初の列名の一部になり、フィールドが原因不明に見つからなくなります。
ネスト構造の復元
ヘッダーがドット区切りのパスになっている場合、たとえば当サイトのコンバーターが出力したCSVなら、「ドット付きヘッダーを展開」を有効にするとネストが復元されます。address.cityは、ドットを含むキーではなくネストしたオブジェクトになります。
How to do this in code
コードでの変換。
py Python
utf-8-sigがBOMを取り除きます。dtype=strは、pandasに007を7へ変えさせないための指定です。
import csv, json
# The standard library gives you strings, which is the honest default
with open('in.csv', newline='', encoding='utf-8-sig') as f:
rows = list(csv.DictReader(f))
print(json.dumps(rows, indent=2))
# pandas infers types, which is convenient and lossy
import pandas as pd
df = pd.read_csv('in.csv', dtype=str) # dtype=str turns inference OFF
records = df.to_dict(orient='records') js JavaScript
import Papa from 'papaparse';
const { data, errors } = Papa.parse(csv, {
header: true,
skipEmptyLines: true,
dynamicTyping: false, // leave it off; see the note above
}); sh Shell
# csvkit
in2csv data.csv | csvjson --indent 2 > data.json
# Or with Miller, which is a single binary
mlr --icsv --ojson cat data.csv よくある質問
- 型推論は有効にすべきですか?
- データの中身が分かっている場合だけです。推論はたいてい正しく、例外はまさに失ってはいけない値です。郵便番号、口座番号、部品番号、電話番号、そして先頭にゼロが付くもの全般。推論を有効にしていても、このツールはそれらには手を付けません。
- 最初の列名がおかしいのはなぜですか?
- バイトオーダーマークです。このツールはそれを取り除き、そのことを報告します。取り除かないパーサーでは、名前の先頭に見えない文字が残り、その名前での参照が理由も見えないまま失敗します。
- 配列ではなくNDJSONで出力できますか?
- ここで変換したうえで、NDJSONのページを使ってください。配列を1行1レコードに変換できます。ストリーミングや追記を想定するなら、そちらのほうが適した形式です。