本文へスキップ
jsonbeautifiers
日本語

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レコードに変換できます。ストリーミングや追記を想定するなら、そちらのほうが適した形式です。