CSV to JSON 변환기
CSV 데이터를 JSON 배열 또는 객체 형식으로 변환
CSV to JSON 변환이란?
CSV(Comma-Separated Values)는 각 줄이 하나의 데이터 레코드이고, 레코드 내 필드가 구분자(일반적으로 쉼표)로 구분되는 일반 텍스트 표 형식입니다. CSV는 개인용 컴퓨터 초기부터 표준 교환 형식으로 사용되어 왔으며, RFC 4180으로 공식 정의되었습니다. 스프레드시트, 데이터베이스, 데이터 내보내기 도구 모두 CSV를 생성하는데, 이는 단순하고 간결하며 거의 모든 프로그래밍 언어에서 읽을 수 있기 때문입니다.
JSON(JavaScript Object Notation)은 키-값 쌍과 순서가 있는 배열로 구조화된 데이터를 표현합니다. CSV와 달리 JSON은 중첩 객체, 타입이 있는 값(숫자, 불리언, null), 가변 길이 레코드를 지원합니다. JSON은 JavaScript 엔진에서 기본적으로 이해되기 때문에 브라우저-서버 간 데이터 교환과 REST API 응답의 주요 형식입니다. 이러한 특성으로 인해 JSON은 웹 API, 설정 파일, MongoDB와 CouchDB 같은 NoSQL 데이터베이스의 기본 형식이 되었습니다.
CSV를 JSON으로 변환한다는 것은 테이블의 각 행을 JSON 객체로 매핑하고, 헤더 행을 속성 이름으로, 셀 값을 속성 값으로 사용하는 것을 의미합니다. 결과는 일반적으로 JSON 객체 배열입니다. 이 변환은 REST API, 프론트엔드 데이터 테이블 컴포넌트, 문서 지향 데이터베이스 등 구조화된 JSON 입력을 기대하는 시스템에 평탄한 표 형식 데이터를 제공해야 할 때 필요합니다.
이 도구를 사용하는 이유
이 변환기는 브라우저에서 CSV를 파싱하고 JSON 출력을 즉시 생성하며, 데이터를 서버로 전송하지 않습니다.
CSV to JSON 활용 사례
CSV 구분자 참조
CSV 파일이 항상 쉼표를 사용하는 것은 아닙니다. 구분자는 로케일, 내보내는 애플리케이션, 데이터 내용에 따라 달라집니다. 가장 일반적인 네 가지 구분자와 각각의 일반적인 사용 시점입니다.
| 구분자 | 표준 | 확장자 | 비고 |
|---|---|---|---|
| Comma (,) | RFC 4180 default | .csv | Most common; Excel default export |
| Tab (\t) | TSV variant | .tsv | Avoids quoting fields that contain commas |
| Semicolon (;) | European locale CSV | .csv | Used where comma is the decimal separator (DE, FR, BR) |
| Pipe (|) | Fixed-width alternative | .csv | Rare in field values, good for messy data |
CSV vs JSON: 구조적 차이
두 형식 간의 차이가 변환 시 헤더 매핑, 타입 추론, 누락 값 처리에 명시적인 결정이 필요한 이유입니다.
코드 예제
주요 언어와 CLI 도구에서 CSV를 JSON으로 프로그래밍 방식으로 변환하는 방법:
// Simple CSV string → JSON array
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`
const [headerLine, ...rows] = csv.trim().split('\n')
const headers = headerLine.split(',')
const json = rows.map(row => {
const values = row.split(',')
return Object.fromEntries(headers.map((h, i) => [h, values[i]]))
})
// → [{ name: "Alice", age: "30", city: "Berlin" }, ...]
// With the built-in fetch + a library (Papa Parse)
import Papa from 'papaparse'
const result = Papa.parse(csvString, { header: true, dynamicTyping: true })
console.log(result.data) // typed numbers and booleansimport csv, json, io
csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""
reader = csv.DictReader(io.StringIO(csv_string))
data = [row for row in reader]
print(json.dumps(data, indent=2))
# → [{"name": "Alice", "age": "30", "city": "Berlin"}, ...]
# With type coercion (age as int)
import pandas as pd
df = pd.read_csv(io.StringIO(csv_string))
print(df.to_json(orient="records", indent=2))
# → [{"name": "Alice", "age": 30, "city": "Berlin"}, ...]package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"strings"
)
func main() {
input := "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo"
r := csv.NewReader(strings.NewReader(input))
records, _ := r.ReadAll()
headers := records[0]
var result []map[string]string
for _, row := range records[1:] {
obj := make(map[string]string)
for i, h := range headers {
obj[h] = row[i]
}
result = append(result, obj)
}
out, _ := json.MarshalIndent(result, "", " ")
fmt.Println(string(out))
// → [{"age":"30","city":"Berlin","name":"Alice"}, ...]
}# Using Miller (mlr) — handles quoting, types, and edge cases
mlr --icsv --ojson cat data.csv
# → [{"name": "Alice", "age": 30, "city": "Berlin"}, ...]
# Using csvjson from csvkit (Python-based)
csvjson data.csv
# Using jq with @csv (reverse: JSON → CSV)
# For CSV → JSON, pipe through Miller or Python
cat data.csv | python3 -c "
import csv, json, sys
reader = csv.DictReader(sys.stdin)
json.dump(list(reader), sys.stdout, indent=2)
"