DevToolBox無料
ブログ

CSV to JSON コンバーター完全ガイド:コード例付き

11分by DevToolBox

CSVからJSONへの変換は、開発者が日常的に直面する最も一般的なデータ変換タスクの一つです。システム間のデータ移行、API構築、スプレッドシート処理など、CSVをJSONに変換する方法を効率的に知ることは不可欠です。この包括的なガイドでは、変換ツール、解析アルゴリズム、JavaScript、Python、Bashのコード例、エッジケースのベストプラクティスをカバーします。

無料オンラインCSV to JSON変換ツールをお試しください。

CSVとは?

CSVはComma-Separated Values(カンマ区切り値)の略で、RFC 4180で定義された表形式データを格納するプレーンテキストファイル形式です。各行はレコードを表し、値はカンマや他の区切り文字で区切られます。最初の行は通常ヘッダーとして機能します。

CSV形式はコンピューティングの初期から使用されており、そのシンプルさから今も人気があります。あらゆるテキストエディタ、スプレッドシート、プログラミング言語でCSVを読み書きできます。シンプルですが、CSVパーサーは引用フィールド、エスケープされた引用符、複数行の値など、いくつかの厄介なケースを処理する必要があります。

CSVとJSONの使い分け:CSVはスプレッドシートのエクスポートやデータベースダンプなどのフラットな表形式データに適しています。JSONは階層的なデータ構造、APIレスポンス、設定ファイルに適しています。

CSV vs JSON:詳細比較

CSVとJSONの違いを理解することは、フォーマット選択と変換プロセスの理解に役立ちます:

特徴CSVJSON
構造フラット、表形式階層的(ネストされたオブジェクト)
可読性シンプルなデータでは簡単フォーマットすると読みやすい
ネストネイティブ非対応完全対応
データ型すべて文字列文字列、数値、ブール、null、配列、オブジェクト
ファイルサイズ一般的に小さい大きい(キーの繰り返し)
用途スプレッドシート、DBエクスポートAPI、設定、NoSQL、Webアプリ

CSVからJSON変換の仕組み

CSV to JSONコンバーターのプロセスには以下のステップがあります:

  1. ヘッダー行を読む:列名を抽出し、JSONキーにする。
  2. 各データ行を解析:区切り文字で分割し、値をヘッダーに対応付ける。
  3. 引用フィールドを処理:二重引用符で囲まれた値はカンマや改行を含んでも1つのフィールド。
  4. データ型を検出:数値、ブール値、null値を自動変換。
  5. JSON配列を構築:各行がオブジェクトになり、すべて配列に集められる。

:CSV name,age,active\nAlice,30,true[{"name":"Alice","age":30,"active":true}] になります。

CSV to JSONコード例

JavaScript:CSV to JSON変換

CSV to JSON JavaScript変換の複数のアプローチ:ネイティブ、Papa Parse、Node.jsのcsv-parser:

// ===== Native JavaScript: CSV to JSON =====

function csvToJson(csv) {
  const lines = csv.trim().split('\n');
  const headers = lines[0].split(',').map(h => h.trim());
  const result = [];

  for (let i = 1; i < lines.length; i++) {
    const values = lines[i].split(',');
    const obj = {};
    headers.forEach((header, index) => {
      let val = values[index]?.trim() || '';
      // Auto-detect types
      if (val === 'true') val = true;
      else if (val === 'false') val = false;
      else if (val === 'null' || val === '') val = null;
      else if (!isNaN(val) && val !== '') val = Number(val);
      obj[header] = val;
    });
    result.push(obj);
  }
  return result;
}

const csv = `name,age,city,active
Alice,30,New York,true
Bob,25,London,false
Charlie,35,Tokyo,true`;

console.log(JSON.stringify(csvToJson(csv), null, 2));
// [
//   { "name": "Alice", "age": 30, "city": "New York", "active": true },
//   { "name": "Bob", "age": 25, "city": "London", "active": false },
//   { "name": "Charlie", "age": 35, "city": "Tokyo", "active": true }
// ]

// ===== Papa Parse (Browser & Node.js) =====
// npm install papaparse

import Papa from 'papaparse';

// Parse CSV string
const result = Papa.parse(csvString, {
  header: true,         // Use first row as keys
  dynamicTyping: true,  // Auto-detect numbers and booleans
  skipEmptyLines: true, // Ignore blank lines
});

console.log(result.data);   // Array of JSON objects
console.log(result.errors); // Any parsing errors
console.log(result.meta);   // Metadata (delimiter, fields, etc.)

// Parse CSV file (browser)
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (e) => {
  Papa.parse(e.target.files[0], {
    header: true,
    dynamicTyping: true,
    complete: (results) => {
      console.log(results.data); // JSON array
    },
  });
});

// ===== Node.js: csv-parser (streaming) =====
// npm install csv-parser

const csvParser = require('csv-parser');
const fs = require('fs');

const results = [];
fs.createReadStream('data.csv')
  .pipe(csvParser())
  .on('data', (row) => results.push(row))
  .on('end', () => {
    console.log(JSON.stringify(results, null, 2));
  });

Python:CSV to JSON変換

CSV to JSON Python変換をcsvモジュール、pandasjson.dumpsで:

# ===== Python csv module =====
import csv
import json

# CSV string to JSON
csv_string = """name,age,city,active
Alice,30,New York,true
Bob,25,London,false"""

reader = csv.DictReader(csv_string.strip().splitlines())
data = list(reader)
json_output = json.dumps(data, indent=2)
print(json_output)

# CSV file to JSON file
with open('input.csv', 'r', encoding='utf-8') as csv_file:
    reader = csv.DictReader(csv_file)
    data = list(reader)

with open('output.json', 'w', encoding='utf-8') as json_file:
    json.dump(data, json_file, indent=2, ensure_ascii=False)

# ===== pandas (recommended for large datasets) =====
import pandas as pd

# CSV to JSON with pandas
df = pd.read_csv('data.csv')

# Different JSON orientations
print(df.to_json(orient='records', indent=2))  # Array of objects
print(df.to_json(orient='columns', indent=2))  # Object of arrays
print(df.to_json(orient='index', indent=2))     # Object keyed by index

# With type conversion
df['age'] = pd.to_numeric(df['age'], errors='coerce')
df['active'] = df['active'].map({'true': True, 'false': False})

# Save to file
df.to_json('output.json', orient='records', indent=2, force_ascii=False)

# ===== Streaming large CSV files =====
import csv
import json

def csv_to_json_stream(csv_path, json_path, chunk_size=1000):
    """Convert large CSV to JSON using streaming."""
    with open(json_path, 'w') as out:
        out.write('[\n')
        with open(csv_path, 'r', encoding='utf-8') as f:
            reader = csv.DictReader(f)
            first = True
            for row in reader:
                if not first:
                    out.write(',\n')
                json.dump(row, out, ensure_ascii=False)
                first = False
        out.write('\n]')

csv_to_json_stream('large_file.csv', 'output.json')

Bash / コマンドライン:CSV to JSON

コマンドラインでの変換:csvkitmillerjqawk

# ===== csvkit: csvjson command =====
# pip install csvkit

# Basic CSV to JSON conversion
csvjson data.csv > output.json

# Indent output for readability
csvjson --indent 2 data.csv > output.json

# Specify a key column (creates object instead of array)
csvjson --key id data.csv > output.json

# ===== miller (mlr): powerful data processing =====
# brew install miller (macOS) or apt install miller (Linux)

# CSV to JSON
mlr --icsv --ojson cat data.csv > output.json

# CSV to JSON with filtering
mlr --icsv --ojson filter '$age > 25' data.csv

# CSV to JSON with field selection
mlr --icsv --ojson cut -f name,city data.csv

# ===== jq + awk: lightweight approach =====
# Convert simple CSV to JSON with awk
awk -F',' 'NR==1{split($0,h);next}
{printf "{";for(i=1;i<=NF;i++)
printf "%s\"%s\":\"%s\"",
(i>1?",":""),h[i],$i;print "}"}' data.csv | jq -s '.'

# ===== Using sed + jq for quick conversion =====
# Convert CSV to JSON (simple, no quoted fields)
head -1 data.csv | tr ',' '\n' > /tmp/headers.txt
tail -n +2 data.csv | while IFS=',' read -r col1 col2 col3; do
  jq -n --arg a "$col1" --arg b "$col2" --arg c "$col3" \
    '{name:$a, age:($b|tonumber), city:$c}'
done | jq -s '.'

専用CLIツール:csvjsonとmiller

csvjson(csvkit)とmiller(mlr)はデータ形式変換専用のコマンドラインツールです:

# ===== csvkit: full suite of CSV tools =====
# pip install csvkit

# View CSV statistics
csvstat data.csv

# Convert CSV to JSON
csvjson data.csv

# Convert Excel to CSV first, then to JSON
in2csv data.xlsx | csvjson > output.json

# Query CSV with SQL syntax, output as JSON
csvsql --query "SELECT name, age FROM data WHERE age > 25" data.csv | csvjson

# ===== miller (mlr): Swiss Army knife for data =====

# CSV to JSON (pretty-printed)
mlr --icsv --ojson --jflatsep '.' cat data.csv

# CSV to JSON with data transformation
mlr --icsv --ojson put '$full_name = $first . " " . $last' data.csv

# CSV to NDJSON (newline-delimited JSON, one object per line)
mlr --icsv --ojsonl cat data.csv

# Convert between any formats
mlr --icsv --ojson cat data.csv       # CSV -> JSON
mlr --ijson --ocsv cat data.json      # JSON -> CSV
mlr --icsv --otsv cat data.csv        # CSV -> TSV
mlr --itsv --ojson cat data.tsv       # TSV -> JSON

JSON to CSV変換(逆プロセス)

逆プロセスのJSON to CSVは、階層的なJSONデータをフラットな表形式に変換します。

ネストされたオブジェクトのフラット化:ドット記法やアンダースコアで展開:user.nameuser.address.city

JavaScriptとPythonでのJSON to CSV変換例:

// ===== JavaScript: JSON to CSV =====

function jsonToCsv(jsonArray) {
  if (!jsonArray.length) return '';

  // Flatten nested objects
  function flatten(obj, prefix = '') {
    return Object.keys(obj).reduce((acc, key) => {
      const fullKey = prefix ? prefix + '.' + key : key;
      if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
        Object.assign(acc, flatten(obj[key], fullKey));
      } else if (Array.isArray(obj[key])) {
        acc[fullKey] = obj[key].join('|'); // Join arrays with pipe
      } else {
        acc[fullKey] = obj[key];
      }
      return acc;
    }, {});
  }

  const flatData = jsonArray.map(item => flatten(item));
  const headers = [...new Set(flatData.flatMap(Object.keys))];

  const csvRows = [headers.join(',')];
  for (const row of flatData) {
    const values = headers.map(h => {
      const val = row[h] ?? '';
      // Quote values containing commas, quotes, or newlines
      const str = String(val);
      return str.includes(',') || str.includes('"') || str.includes('\n')
        ? '"' + str.replace(/"/g, '""') + '"'
        : str;
    });
    csvRows.push(values.join(','));
  }
  return csvRows.join('\n');
}

// Example with nested JSON
const data = [
  { name: "Alice", address: { city: "NYC", zip: "10001" }, tags: ["dev", "admin"] },
  { name: "Bob", address: { city: "London", zip: "EC1A" }, tags: ["user"] },
];
console.log(jsonToCsv(data));
// name,address.city,address.zip,tags
// Alice,NYC,10001,dev|admin
// Bob,London,EC1A,user
# ===== Python: JSON to CSV =====
import json
import csv
import pandas as pd

# Method 1: pandas (easiest)
with open('data.json') as f:
    data = json.load(f)

df = pd.json_normalize(data, sep='.')  # Flatten nested objects
df.to_csv('output.csv', index=False)

# Method 2: csv module (manual control)
def json_to_csv(json_data, csv_path):
    """Convert JSON array to CSV, handling nested objects."""
    flat_data = [flatten_dict(item) for item in json_data]
    fieldnames = list(dict.fromkeys(
        key for item in flat_data for key in item.keys()
    ))

    with open(csv_path, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(flat_data)

def flatten_dict(d, parent_key='', sep='.'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_dict(v, new_key, sep).items())
        elif isinstance(v, list):
            items.append((new_key, '|'.join(str(i) for i in v)))
        else:
            items.append((new_key, v))
    return dict(items)

CSV解析のエッジケース処理

堅牢なCSVパーサーは多数のエッジケースを処理する必要があります:

UTF-8 BOM:一部のアプリケーションがファイル先頭に不可視のBOMを付加します。パーサーはこれを除去すべきです。

区切り文字のバリエーション:ヨーロッパではセミコロン、TSVではタブ。良いパーサーは自動検出します。

欠損値と空フィールド:末尾のカンマや中間の空フィールド。空文字列またはnullとして保持すべきです。

複数行フィールド:RFC 4180は二重引用符内の複数行値を許可しています。

特殊文字とエスケープ:引用フィールド内の二重引用符は二重化でエスケープします。

不整合な行の長さ:堅牢なパーサーは短い行を空値で埋めるか、長い行を切り詰めるべきです。

// Robust CSV parser handling all edge cases
function parseCSV(text, delimiter = ',') {
  // Strip UTF-8 BOM if present
  if (text.charCodeAt(0) === 0xFEFF) {
    text = text.slice(1);
  }

  const rows = [];
  let row = [];
  let field = '';
  let inQuotes = false;

  for (let i = 0; i < text.length; i++) {
    const char = text[i];
    const next = text[i + 1];

    if (inQuotes) {
      if (char === '"' && next === '"') {
        field += '"'; // Escaped quote
        i++;          // Skip next quote
      } else if (char === '"') {
        inQuotes = false; // End of quoted field
      } else {
        field += char; // Regular char inside quotes
      }
    } else {
      if (char === '"') {
        inQuotes = true; // Start quoted field
      } else if (char === delimiter) {
        row.push(field);
        field = '';
      } else if (char === '\n' || (char === '\r' && next === '\n')) {
        row.push(field);
        rows.push(row);
        row = [];
        field = '';
        if (char === '\r') i++; // Skip \n in \r\n
      } else {
        field += char;
      }
    }
  }

  // Push last field and row
  if (field || row.length) {
    row.push(field);
    rows.push(row);
  }

  return rows;
}

CSVベストプラクティス

最大の互換性とデータ整合性のためにこれらのベストプラクティスに従ってください:

常にUTF-8エンコーディングを使用:テキストエンコーディングのユニバーサル標準。

フィールドを一貫して引用:最も安全なのは全フィールドを引用すること。

ヘッダー行を含める:記述的な名前と一貫した命名規則で。

一貫した区切り文字を使用:ファイル全体で1つの区切り文字。

大きなファイルはストリーム処理:メモリを超えるファイルにはストリーミングパーサーを使用。

変換後にデータを検証:レコード数、データ型、整合性を確認。

よくある質問

CSVをJSONに変換するには?

ヘッダー行を解析して列名を取得し、各行を対応するキーにマッピングします。Papa Parse(JavaScript)やpandas(Python)などのライブラリ、または無料オンラインツールを使用できます。

CSVとJSONの違いは?

CSVはフラットな表形式で全値が文字列。JSONは階層的でネストオブジェクト、配列、複数のデータ型をサポート。CSVはよりコンパクト、JSONはより表現力豊か。

CSVはネストされたデータを扱えますか?

いいえ、CSVはネイティブではネスト構造をサポートしません。ドット記法、CSV内のJSON文字列エンコード、別々のCSVファイルなどでデータをフラット化する必要があります。

CSV to JSON変換は開発者とデータアナリストの基本的なスキルです。無料ツールで即座に変換できます。

無料オンラインツールでCSVとJSONを即座に変換。

𝕏 Twitterin LinkedIn
この記事は役に立ちましたか?

最新情報を受け取る

毎週の開発ヒントと新ツール情報。

スパムなし。いつでも解除可能。

Try These Related Tools

📊CSV ↔ JSON Converter{ }JSON FormatterY{}JSON ↔ YAML Converter<>XML Formatter

Related Articles

JSON vs YAML vs TOML:どの設定フォーマットを使うべき?

JSON、YAML、TOML の設定フォーマットを比較。

JSONフォーマッター&バリデーター:オンラインで整形・検証

無料のJSONフォーマッターとバリデーター。JSONの整形、構文エラーの検出、ベストプラクティスを解説。

JSON から TypeScript へ:実例付き完全ガイド

JSON データを TypeScript インターフェースに自動変換する方法を学びます。ネストされたオブジェクト、配列、オプショナルフィールド、ベストプラクティスを網羅。