DevToolBoxFREE
BlogAdvertise

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
この記事は役に立ちましたか?

Stay Updated

Get weekly dev tips and new tool announcements.

No spam. Unsubscribe anytime.

Partner Picks

Sponsor this article

Place your product next to this developer topic with tracked clicks.

Ask about article sponsorship

This site uses cookies for analytics and to display ads. By continuing to browse, you agree. Privacy Policy