การแปลง CSV เป็น YAML คืออะไร?
การแปลง CSV เป็น YAML คือกระบวนการเปลี่ยนข้อมูลตารางที่คั่นด้วยจุลภาคให้กลายเป็นรูปแบบ YAML (YAML Ain't Markup Language) แต่ละแถวของไฟล์ CSV จะกลายเป็น entry ใน YAML sequence และแต่ละหัวคอลัมน์จะถูก map เป็น key ใน YAML mapping ผลลัพธ์คือเอกสารที่มนุษย์อ่านได้โดยอาศัยการย่อหน้า ซึ่งเครื่องมือ configuration และ data pipeline สามารถ parse ได้โดยตรงโดยไม่ต้องมีไฟล์ schema เพิ่มเติม
YAML ถูกเสนอครั้งแรกในปี 2001 และบรรลุข้อกำหนดฉบับปัจจุบัน (YAML 1.2) ในปี 2009 รูปแบบนี้เป็น configuration format หลักสำหรับ Kubernetes manifests, Docker Compose files, Ansible playbooks, GitHub Actions workflows และระบบ CI/CD จำนวนมาก เมื่อข้อมูลต้นทางอยู่ใน spreadsheet หรือการส่งออกจากฐานข้อมูล การแปลง CSV เป็น YAML คือวิธีที่เร็วที่สุดในการสร้าง config entries, seed data fixtures หรือ test inputs สำหรับระบบเหล่านี้
เครื่องมือแปลง CSV เป็น YAML ที่ถูกต้องต้องรองรับกฎการ parse ตาม RFC 4180 ได้แก่ ฟิลด์ที่ใส่เครื่องหมายคำพูดซึ่งมีจุลภาคหรือขึ้นบรรทัดใหม่ เครื่องหมายคำพูดคู่ที่ escape แล้ว และตัวคั่นที่หลากหลาย ในส่วนของ YAML ต้องทำการใส่เครื่องหมายคำพูดกับสตริงที่มีลักษณะคล้าย boolean (yes, no, true, false) ตัวเลข หรือ null เพื่อป้องกัน YAML parser จากการแปลงประเภทที่ไม่ต้องการ นอกจากนี้ยังต้องรองรับเนื้อหา Unicode และสร้างผลลัพธ์ UTF-8 ที่ถูกต้อง เนื่องจาก YAML 1.2 กำหนดให้ UTF-8 เป็น encoding เริ่มต้น
ทำไมต้องใช้เครื่องมือแปลง CSV เป็น YAML?
การเขียน YAML ด้วยมือจากข้อมูล spreadsheet เป็นงานที่น่าเบื่อและเกิดข้อผิดพลาดได้ง่าย การย่อหน้าที่ผิดพลาดหรืออักขระพิเศษที่ไม่ได้ใส่เครื่องหมายคำพูดจะทำให้ YAML ไม่ถูกต้องและทำให้ config deployments หรือการนำเข้าข้อมูลล้มเหลว เครื่องมือนี้ parse ฟิลด์ CSV, map หัวคอลัมน์เป็น key และสร้าง YAML output ที่มีการย่อหน้าและเครื่องหมายคำพูดที่ถูกต้อง
⚡แปลงได้ทันทีในเบราว์เซอร์
วาง CSV แล้วรับผลลัพธ์ YAML ที่ถูกต้องทันที ไม่ต้องติดตั้ง CLI tools ไม่ต้อง import library และไม่ต้องมี build step ใด ๆ
🔒ข้อมูลของคุณปลอดภัย
การ parse และการแปลงทั้งหมดทำงานในเบราว์เซอร์ของคุณโดยใช้ JavaScript ข้อมูล CSV ของคุณจะไม่ออกจากเครื่อง ไม่ถูกส่งไปยังเซิร์ฟเวอร์ และไม่มีการบันทึกหรือจัดเก็บ
🎯สร้าง YAML ที่มีรูปแบบถูกต้อง
ผลลัพธ์ใช้การย่อหน้าที่ถูกต้อง ใส่เครื่องหมายคำพูดกับสตริงที่อาจถูกตีความเป็น boolean หรือตัวเลข และสร้าง YAML 1.2 ที่ถูกต้องซึ่งผ่าน linter หรือ schema validator ได้
📋รองรับ CSV หลากหลายรูปแบบ
ตรวจจับจุลภาค เซมิโคลอน แท็บ และไปป์เป็นตัวคั่นโดยอัตโนมัติ รองรับกฎการใส่เครื่องหมายคำพูดตาม RFC 4180 รวมถึง escaped double quotes, multiline fields และไฟล์ UTF-8 ที่มี BOM
กรณีการใช้งานแปลง CSV เป็น YAML
Config สำหรับ Kubernetes และ Docker Compose
สร้าง environment variable blocks, ส่วนข้อมูล ConfigMap หรือ service definitions ใน Docker Compose จาก spreadsheet ของ configuration values วาง YAML output ลงใน manifest files ได้โดยตรง
ข้อมูลสำหรับ Ansible playbook
แปลงรายการ hosts, roles และตัวแปรใน CSV เป็นไฟล์ตัวแปร YAML (group_vars, host_vars) ที่ Ansible อ่านได้โดยตรงโดยไม่ต้องใช้ custom parsing plugins
Configuration สำหรับ CI/CD pipeline
แปลง spreadsheet ของ build matrix entries, environment variables หรือ deployment targets เป็น YAML config blocks สำหรับ GitHub Actions, GitLab CI หรือ CircleCI หลีกเลี่ยงการพิมพ์ matrix definitions ซ้ำ ๆ ด้วยมือ
Database seed fixtures
Rails, Django และ frameworks อื่น ๆ ใช้ YAML สำหรับ test fixtures และ seed data แปลงการส่งออก CSV จากฐานข้อมูลเป็นไฟล์ YAML fixture ที่ ORM สามารถโหลดลง test database ได้โดยตรง
การแปลงข้อมูลใน pipeline
ETL pipelines ที่รับ YAML inputs สามารถนำเข้าข้อมูล CSV ที่แปลงแล้วโดยไม่ต้องผ่าน JSON เป็นขั้นกลาง เครื่องมืออย่าง dbt, Dagster และ Prefect ใช้ YAML สำหรับ pipeline definitions และ config
เรียนรู้ YAML syntax
นักศึกษาและนักพัฒนาที่เพิ่งเริ่มใช้ YAML สามารถวางข้อมูล CSV ที่คุ้นเคยและดูว่าแถวตารางถูกแปลงเป็น sequences และ mappings อย่างไร การเปรียบเทียบ input และ output ช่วยให้เข้าใจกฎการย่อหน้า, key-value syntax และการจัดการประเภทข้อมูล
ตารางอ้างอิงการ mapping CSV เป็น YAML
แต่ละองค์ประกอบโครงสร้างของไฟล์ CSV มีส่วนที่สอดคล้องกันใน YAML โดยตรง
| แนวคิด CSV | YAML ที่เทียบเท่า | รายละเอียด |
|---|
| CSV file | YAML document | The entire file becomes a YAML sequence (array) of mappings |
| Header row | Mapping keys | Each column header becomes a key in every mapping entry |
| Data row | Sequence item (- ...) | Each row becomes one mapping item in the top-level array |
| Cell value | Scalar value | Strings, numbers, and booleans are inferred by YAML parsers |
| Empty cell | null or empty string | Rendered as null, ~, or an empty value depending on the tool |
| Comma delimiter | Indentation + colon | CSV delimiters are replaced by YAML key: value structure |
CSV เทียบกับ YAML
CSV เป็นรูปแบบแบบแบนที่ใช้ตัวคั่นโดยไม่มีข้อมูลประเภทหรือลำดับชั้น YAML เป็น superset ของ JSON ที่ใช้การย่อหน้าสำหรับการซ้อน รองรับประเภทข้อมูลหลายชนิด และอนุญาตให้มี comments การเลือกใช้รูปแบบใดขึ้นอยู่กับสิ่งที่เครื่องมือปลายทางของคุณต้องการ
CSV
ข้อความธรรมดา หนึ่งระเบียนต่อบรรทัด ค่าทุกค่าเป็น string ไม่มีลำดับชั้น การซ้อน หรือ comments ขนาดไฟล์เล็ก รองรับโดย spreadsheets, ฐานข้อมูล และ command-line tools ทั่วไป กำหนดโดย RFC 4180 เหมาะที่สุดสำหรับการถ่ายโอนข้อมูลตารางจำนวนมากระหว่างระบบที่ทั้งสองฝ่ายเข้าใจลำดับและประเภทของคอลัมน์
YAML
รูปแบบที่ใช้การย่อหน้าพร้อม native support สำหรับ strings, integers, floats, booleans, null, dates, sequences (arrays) และ mappings (objects) รองรับ inline comments ด้วย # ใช้เป็น config format หลักสำหรับ Kubernetes, Docker Compose, Ansible, GitHub Actions และ DevOps tools ยุคใหม่ส่วนใหญ่ YAML 1.2 เป็น superset ของ JSON ดังนั้น JSON ที่ถูกต้องใด ๆ ก็เป็น YAML ที่ถูกต้องด้วยเช่นกัน
ตัวอย่างโค้ด
ตัวอย่างการทำงานใน Node.js, Python, Go และ CLI tools แต่ละตัวอย่างจะอ่านแถวหัวคอลัมน์ของ CSV เป็น YAML keys, map แต่ละแถวข้อมูลเป็น sequence entry และจัดการการใส่เครื่องหมายคำพูดสำหรับค่าที่มีความกำกวมทางประเภทข้อมูล
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 เป็น YAML ทำงานอย่างไร?
เครื่องมือจะอ่านแถวแรกเป็นหัวคอลัมน์ แต่ละแถวถัดไปจะกลายเป็น YAML mapping (object แบบ key-value) และ mappings ทั้งหมดจะถูกรวบรวมเป็น YAML sequence (array) ผลลัพธ์คือรายการ objects ที่แต่ละ key มาจากหัวคอลัมน์และแต่ละค่ามาจากเนื้อหาใน cell
ค่าอย่าง "true", "yes" หรือ "null" ใน CSV จะถูกจัดการอย่างไร?
YAML parsers ตีความ true, false, yes, no และ null ที่ไม่มีเครื่องหมายคำพูดว่าเป็นค่าที่มีประเภทแทนที่จะเป็น string เครื่องมือจะใส่เครื่องหมายคำพูดกับค่าเหล่านี้เพื่อให้เป็น string ในผลลัพธ์ ตัวอย่างเช่น cell ใน CSV ที่มีค่า "yes" จะกลายเป็น '"yes"' ใน YAML output เพื่อป้องกัน config tool ไม่ให้ตีความว่าเป็น boolean
สามารถแปลง YAML กลับเป็น CSV ได้หรือไม่?
ได้ ตราบใดที่ YAML เป็น flat sequence ของ mappings (array ของ objects ที่มี scalar values) โครงสร้าง YAML ที่ซ้อนกันลึกหรือมีประเภทปนกันไม่สามารถแสดงเป็นแถว CSV ได้อย่างสมบูรณ์ สำหรับโครงสร้างแบบแบน เครื่องมืออย่าง yq, Miller (mlr) หรือโมดูล yaml และ csv ของ Python รองรับการแปลงย้อนกลับได้
ความแตกต่างระหว่างการแปลง CSV เป็น YAML กับ CSV เป็น JSON คืออะไร?
ทั้งคู่สร้างข้อมูลที่มีโครงสร้างจาก CSV input แบบแบน JSON ใช้วงเล็บปีกกาและวงเล็บเหลี่ยมพร้อมกฎการใส่เครื่องหมายคำพูดที่เข้มงวด YAML ใช้การย่อหน้าและเครื่องหมายทวิภาค รองรับ comments และอ่าน/แก้ไขด้วยมือได้ง่ายกว่า DevOps tools ส่วนใหญ่ (Kubernetes, Ansible, Docker Compose) ต้องการ YAML ในขณะที่ web APIs และเครื่องมือที่ใช้ JavaScript มักต้องการ JSON
ตัวเลขและวันที่ถูกจัดการในผลลัพธ์อย่างไร?
CSV ถือว่าทุกค่าเป็น string YAML parsers จะตรวจจับตัวเลขที่ไม่มีเครื่องหมายคำพูด (42, 3.14) และวันที่แบบ ISO (2024-01-15) เป็นประเภทที่สอดคล้องกันโดยอัตโนมัติ หากต้องการให้ทุกค่าเป็น string เครื่องมือสามารถใส่เครื่องหมายคำพูดกับค่าทั้งหมดได้ หากต้องการ type inference ให้ปล่อยค่าไว้โดยไม่มีเครื่องหมายคำพูดแล้วให้ YAML parser จัดการ
เครื่องมือรองรับไฟล์ CSV ขนาดใหญ่ได้หรือไม่?
เครื่องมือทำงานในเบราว์เซอร์ทั้งหมด ดังนั้นประสิทธิภาพจึงขึ้นอยู่กับหน่วยความจำที่มีอยู่และขีดจำกัดของแท็บเบราว์เซอร์ ไฟล์ขนาดไม่กี่ MB (หลายหมื่นแถว) สามารถแปลงได้โดยไม่มีปัญหาบนฮาร์ดแวร์ยุคใหม่ สำหรับไฟล์ขนาดใหญ่มาก (100MB ขึ้นไป) ควรใช้ CLI tool เช่น โมดูล csv และ yaml ของ Python, encoding/csv ของ Go พร้อม gopkg.in/yaml.v3 หรือ Miller (mlr) ซึ่งประมวลผลข้อมูลแบบ stream โดยไม่ต้องโหลดทุกอย่างเข้าหน่วยความจำ
ผลลัพธ์ที่สร้างขึ้นเป็น YAML 1.1 หรือ YAML 1.2?
เครื่องมือนี้สร้างผลลัพธ์เป็น YAML 1.2 ความแตกต่างหลักจาก YAML 1.1 คือ 1.2 ยกเลิก "Norway problem" (การตีความ 'no' ที่ไม่มีเครื่องหมายคำพูดว่าเป็น boolean false) และปรับให้สอดคล้องกับ JSON parsers ยุคใหม่ส่วนใหญ่ (Go yaml.v3, Python PyYAML กับ safe_load, Ruby Psych) รองรับ YAML 1.2 ผลลัพธ์จะยังคง parse ได้ถูกต้องในเกือบทุกกรณี เนื่องจาก 1.2 เข้ากันได้แบบย้อนหลังสำหรับโครงสร้างทั่วไป