ToolDeck

CSV to YAML

CSV 데이터를 YAML 객체 배열로 변환

예시 시도

CSV 입력

YAML 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
YAML 출력이 여기에 표시됩니다…

CSV to YAML 변환이란?

CSV to YAML 변환은 쉼표로 구분된 표 형식 데이터를 YAML(YAML Ain't Markup Language) 형식으로 변환합니다. CSV 파일의 각 행은 YAML 시퀀스의 항목이 되고, 각 열 헤더는 YAML 매핑의 키에 대응합니다. 출력은 사람이 읽기 쉬운 들여쓰기 기반 문서로, 설정 도구와 데이터 파이프라인이 별도의 스키마 파일 없이 직접 파싱할 수 있습니다.

YAML은 2001년에 처음 제안되었고 현재 명세(YAML 1.2)는 2009년에 확정되었습니다. Kubernetes 매니페스트, Docker Compose 파일, Ansible 플레이북, GitHub Actions 워크플로우, 그리고 많은 CI/CD 시스템의 기본 설정 형식입니다. 데이터가 스프레드시트나 데이터베이스 내보내기 형태로 존재할 때, CSV를 YAML로 변환하는 것이 이러한 시스템에 필요한 설정 항목, 시드 데이터 픽스처, 테스트 입력을 생성하는 가장 빠른 방법입니다.

올바른 CSV to YAML 변환기는 RFC 4180 파싱 규칙을 처리해야 합니다. 쉼표나 줄바꿈이 포함된 따옴표 필드, 이스케이프된 큰따옴표, 다양한 구분자가 여기에 해당합니다. YAML 측면에서는 불리언처럼 보이는 값(yes, no, true, false), 숫자, null은 YAML 파서가 의도하지 않은 타입으로 강제 변환하지 않도록 따옴표로 감싸야 합니다. 변환기는 유니코드 콘텐츠도 처리하고 유효한 UTF-8 출력을 생성해야 합니다. YAML 1.2는 UTF-8을 기본 인코딩으로 요구하기 때문입니다.

CSV to YAML 변환기를 사용하는 이유

스프레드시트 데이터에서 YAML을 직접 작성하는 것은 번거롭고 오류가 발생하기 쉽습니다. 잘못된 들여쓰기나 따옴표 없는 특수 문자 하나가 설정 배포나 데이터 가져오기를 중단시키는 유효하지 않은 YAML을 만들어냅니다. 이 변환기는 CSV 필드를 파싱하고, 헤더를 키에 매핑하며, 적절히 들여쓰기되고 올바르게 따옴표 처리된 YAML 출력을 생성합니다.

브라우저에서 즉시 변환
CSV 데이터를 붙여넣거나 업로드하면 즉시 유효한 YAML 출력을 얻습니다. 설치할 CLI 도구도, 가져올 라이브러리도, 별도의 빌드 단계도 필요하지 않습니다.
🔒
데이터 보안 유지
모든 파싱과 변환은 JavaScript를 사용하여 브라우저에서 로컬로 실행됩니다. CSV 데이터는 절대 사용자의 기기를 벗어나지 않으며, 서버로 전송되거나 저장 및 로깅되지 않습니다.
🎯
올바르게 형식화된 YAML 생성
출력은 올바른 들여쓰기를 사용하고, 불리언이나 숫자로 잘못 해석될 수 있는 문자열을 따옴표로 감싸며, 모든 린터나 스키마 검증기를 통과하는 유효한 YAML 1.2를 생성합니다.
📋
모든 CSV 방언 처리
쉼표, 세미콜론, 탭, 파이프를 구분자로 자동 감지합니다. 이스케이프된 큰따옴표, 멀티라인 필드, BOM이 포함된 UTF-8 파일을 포함한 RFC 4180 인용 규칙을 지원합니다.

CSV to YAML 활용 사례

Kubernetes 및 Docker Compose 설정
설정 값 스프레드시트에서 환경 변수 블록, ConfigMap 데이터 섹션, Docker Compose 서비스 정의를 생성합니다. YAML 출력을 매니페스트 파일에 바로 붙여넣을 수 있습니다.
Ansible 플레이북 데이터
호스트, 역할, 변수로 구성된 CSV 인벤토리를 Ansible이 커스텀 파싱 플러그인 없이 기본으로 읽을 수 있는 YAML 형식의 변수 파일(group_vars, host_vars)로 변환합니다.
CI/CD 파이프라인 설정
빌드 매트릭스 항목, 환경 변수, 배포 대상으로 구성된 스프레드시트를 GitHub Actions, GitLab CI, CircleCI YAML 설정 블록으로 변환합니다. 반복적인 매트릭스 정의를 수동으로 작성하는 번거로움을 없애줍니다.
데이터베이스 시드 픽스처
Rails, Django 등의 프레임워크는 테스트 픽스처와 시드 데이터에 YAML을 사용합니다. CSV 데이터베이스 내보내기를 ORM이 테스트 데이터베이스에 직접 로드할 수 있는 YAML 픽스처 파일로 변환합니다.
데이터 파이프라인 변환
YAML 입력을 받는 ETL 파이프라인은 JSON 중간 단계 없이 변환된 CSV 데이터를 바로 수집할 수 있습니다. dbt, Dagster, Prefect 같은 도구는 파이프라인 정의와 설정에 YAML을 사용합니다.
YAML 문법 학습
YAML을 처음 접하는 학생과 개발자가 익숙한 CSV 데이터를 붙여넣어 표 형식의 행이 시퀀스와 매핑으로 어떻게 변환되는지 확인할 수 있습니다. 입력과 출력을 비교하면 들여쓰기 규칙, 키-값 문법, 타입 처리를 명확하게 이해할 수 있습니다.

CSV to YAML 매핑 참조

CSV 파일의 각 구조적 요소는 YAML에서 직접 대응하는 개념이 있습니다.

CSV 개념YAML 대응세부 사항
CSV fileYAML documentThe entire file becomes a YAML sequence (array) of mappings
Header rowMapping keysEach column header becomes a key in every mapping entry
Data rowSequence item (- ...)Each row becomes one mapping item in the top-level array
Cell valueScalar valueStrings, numbers, and booleans are inferred by YAML parsers
Empty cellnull or empty stringRendered as null, ~, or an empty value depending on the tool
Comma delimiterIndentation + colonCSV delimiters are replaced by YAML key: value structure

CSV vs YAML

CSV는 타입 정보나 계층 구조가 없는 단순한 구분자 기반 형식입니다. YAML은 중첩을 위해 들여쓰기를 사용하고, 여러 데이터 타입을 지원하며, 주석을 허용하는 JSON의 상위 집합입니다. 선택은 다운스트림 도구가 무엇을 요구하는지에 따라 달라집니다.

CSV
일반 텍스트, 한 줄에 하나의 레코드. 모든 값은 문자열입니다. 계층 구조, 중첩, 주석이 없습니다. 파일 크기가 최소화됩니다. 스프레드시트, 데이터베이스, 커맨드라인 도구에서 범용적으로 지원됩니다. RFC 4180으로 정의되었습니다. 열 순서와 타입에 대해 합의된 시스템 간 대량 표 형식 데이터 전송에 최적입니다.
YAML
문자열, 정수, 부동소수점, 불리언, null, 날짜, 시퀀스(배열), 매핑(객체)을 기본 지원하는 들여쓰기 기반 형식입니다. #을 사용한 인라인 주석을 허용합니다. Kubernetes, Docker Compose, Ansible, GitHub Actions, 그리고 대부분의 현대 DevOps 도구의 기본 설정 형식으로 사용됩니다. YAML 1.2는 JSON의 상위 집합이므로 모든 유효한 JSON은 유효한 YAML이기도 합니다.

코드 예제

Node.js, Python, Go, CLI 도구에서의 동작 예제입니다. 각각 CSV 헤더 행을 YAML 키로 읽고, 각 데이터 행을 시퀀스 항목에 매핑하며, 타입이 모호한 값에 대한 따옴표 처리를 수행합니다.

JavaScript (Node.js)
import { parse } from 'csv-parse/sync'
import { stringify } from 'yaml'

const csv = `name,age,city
Alice,30,Berlin
Bob,25,"New York"`

const records = parse(csv, { columns: true, skip_empty_lines: true })
console.log(stringify(records))
// → - name: Alice
// →   age: "30"
// →   city: Berlin
// → - name: Bob
// →   age: "25"
// →   city: New York

// Vanilla JS (no dependencies)
function csvToYaml(csv) {
  const [headerLine, ...dataLines] = csv.trim().split('\n')
  const headers = headerLine.split(',')
  return dataLines.map(line => {
    const values = line.split(',')
    return headers.map((h, i) => `  ${h}: ${values[i] || ''}`).join('\n')
  }).map(block => `- ${block.trimStart()}`).join('\n')
}
Python
import csv, io, yaml

csv_string = """name,age,city
Alice,30,Berlin
Bob,25,New York"""

reader = csv.DictReader(io.StringIO(csv_string))
data = list(reader)

# default_flow_style=False produces block-style YAML
print(yaml.dump(data, default_flow_style=False, sort_keys=False))
# → - age: '30'
# →   city: Berlin
# →   name: Alice
# → - age: '25'
# →   city: New York
# →   name: Bob

# Preserve insertion order with sort_keys=False (Python 3.7+)
# To type-cast numbers: data = [{k: int(v) if v.isdigit() else v ...}]
Go
package main

import (
	"encoding/csv"
	"fmt"
	"gopkg.in/yaml.v3"
	"strings"
)

func main() {
	input := "name,age,city
Alice,30,Berlin
Bob,25,New York"
	r := csv.NewReader(strings.NewReader(input))
	records, _ := r.ReadAll()
	headers := records[0]

	var data []map[string]string
	for _, row := range records[1:] {
		entry := make(map[string]string)
		for i, h := range headers {
			entry[h] = row[i]
		}
		data = append(data, entry)
	}

	out, _ := yaml.Marshal(data)
	fmt.Println(string(out))
	// → - age: "30"
	// →   city: Berlin
	// →   name: Alice
	// → - age: "25"
	// →   city: New York
	// →   name: Bob
}
CLI (yq / Miller)
# Using yq (https://github.com/mikefarah/yq)
# yq reads CSV with --input-format=csv
yq --input-format=csv --output-format=yaml '.' data.csv

# Using Miller (mlr) — converts between CSV, JSON, YAML, and more
mlr --icsv --oyaml cat data.csv

# Python one-liner for quick conversion
python3 -c "
import csv, sys, yaml
data = list(csv.DictReader(sys.stdin))
print(yaml.dump(data, default_flow_style=False, sort_keys=False))
" < data.csv

자주 묻는 질문

CSV to YAML 변환은 어떻게 동작하나요?
변환기는 첫 번째 행을 열 헤더로 읽습니다. 이후 각 행은 YAML 매핑(키-값 객체)이 되고, 모든 매핑은 YAML 시퀀스(배열)로 수집됩니다. 결과는 각 키가 헤더에서, 각 값이 셀 내용에서 오는 객체 목록입니다.
CSV에 "true", "yes", "null" 같은 값이 있으면 어떻게 되나요?
YAML 파서는 따옴표 없는 true, false, yes, no, null을 문자열이 아닌 타입이 있는 값으로 해석합니다. 변환기는 이러한 값을 따옴표로 감싸 출력에서 문자열로 유지합니다. 예를 들어 CSV 셀에 "yes"가 있으면 YAML 출력에서 '"yes"'가 되어 설정 도구가 불리언으로 해석하는 것을 방지합니다.
YAML을 다시 CSV로 변환할 수 있나요?
네, YAML이 평탄한 매핑의 시퀀스(스칼라 값을 가진 객체 배열)인 경우에 가능합니다. 깊이 중첩된 맵이나 혼합 타입이 있는 중첩 YAML 구조는 CSV 행으로 깔끔하게 표현할 수 없습니다. 평탄한 구조의 경우 yq, Miller(mlr), 또는 Python의 yaml 및 csv 모듈이 역변환을 처리합니다.
CSV to YAML과 CSV to JSON의 차이점은 무엇인가요?
두 방식 모두 평탄한 CSV 입력에서 구조화된 데이터를 생성합니다. JSON은 엄격한 따옴표 규칙과 함께 중괄호와 대괄호를 사용합니다. YAML은 들여쓰기와 콜론을 사용하고, 주석을 지원하며, 사람이 읽고 편집하기 더 쉽습니다. 대부분의 DevOps 도구(Kubernetes, Ansible, Docker Compose)는 YAML을 기대하고, 대부분의 웹 API와 JavaScript 기반 도구는 JSON을 기대합니다.
출력에서 숫자와 날짜는 어떻게 처리되나요?
CSV는 모든 값을 문자열로 취급합니다. YAML 파서는 따옴표 없는 숫자(42, 3.14)와 ISO 날짜(2024-01-15)를 해당 타입으로 자동 감지합니다. 모든 값을 문자열로 유지해야 한다면 변환기가 모든 값을 따옴표로 감쌀 수 있습니다. 타입 추론을 원한다면 값을 따옴표 없이 두고 YAML 파서가 타입 해석을 처리하도록 하세요.
변환기가 대용량 CSV 파일을 처리할 수 있나요?
이 도구는 완전히 브라우저에서 실행되므로 성능은 사용 가능한 메모리와 브라우저 탭 한계에 따라 달라집니다. 수 메가바이트(수만 행) 이하의 파일은 최신 하드웨어에서 문제없이 변환됩니다. 매우 큰 파일(100MB 이상)의 경우 Python의 csv 및 yaml 모듈, gopkg.in/yaml.v3와 함께 사용하는 Go의 encoding/csv, 또는 모든 것을 메모리에 로드하지 않고 데이터를 스트리밍할 수 있는 Miller(mlr)를 사용하세요.
YAML 1.1과 YAML 1.2 중 어느 버전으로 출력되나요?
이 도구는 YAML 1.2 출력을 생성합니다. YAML 1.1과의 주요 차이점은 1.2에서 '노르웨이 문제'(bare 'no'가 불리언 false로 해석되는 현상)를 제거하고 JSON 호환성을 맞춘 것입니다. 대부분의 현대 파서(Go yaml.v3, Python PyYAML의 safe_load, Ruby Psych)는 YAML 1.2를 지원합니다. 도구가 1.1 호환성을 요구하더라도, 1.2는 일반적인 구조에 대해 하위 호환성을 제공하므로 거의 모든 경우에 정상적으로 파싱됩니다.