تبدیل CSV به YAML، دادههای جدولی جداشده با کاما را به فرمت YAML (YAML Ain't Markup Language) تبدیل میکند. هر سطر فایل CSV به یک ورودی در یک آرایه YAML تبدیل میشود و هر سرستون به یک کلید در یک مپ YAML تبدیل میشود. خروجی یک سند مبتنی بر تورفتگی و قابلخواندن توسط انسان است که ابزارهای پیکربندی و خطوط لوله داده میتوانند بدون نیاز به فایلهای schema اضافی مستقیماً تجزیه کنند.
YAML در سال ۲۰۰۱ پیشنهاد شد و به مشخصات فعلی خود (YAML 1.2) در سال ۲۰۰۹ رسید. این فرمت، قالب پیکربندی پیشفرض برای مانیفستهای Kubernetes، فایلهای Docker Compose، playbookهای Ansible، workflowهای GitHub Actions و بسیاری از سیستمهای CI/CD است. وقتی داده منبع شما در یک صفحهگسترده یا صادرات پایگاه داده قرار دارد، تبدیل CSV به YAML سریعترین راه برای تولید ورودیهای پیکربندی، fixtureهای داده اولیه یا ورودیهای آزمون برای این سیستمها است.
یک مبدل صحیح CSV به YAML باید قوانین تجزیه RFC 4180 را مدیریت کند: فیلدهای quote شده حاوی کاما یا سطر جدید، گیومههای دوتایی escape شده، و جداکنندههای متغیر. در طرف YAML، رشتههایی که شبیه بولین (yes، no، true، false)، عدد یا null هستند باید quote شوند تا پارسرهای YAML آنها را به انواع غیرمنتظره تبدیل نکنند. مبدل همچنین باید محتوای Unicode را مدیریت کرده و خروجی معتبر UTF-8 تولید کند، چرا که YAML 1.2 رمزگذاری UTF-8 را بهعنوان پیشفرض الزامی میداند.
چرا از مبدل CSV به YAML استفاده کنیم؟
نوشتن دستی YAML از دادههای صفحهگسترده خستهکننده و مستعد خطا است. یک تورفتگی اشتباه یا یک کاراکتر خاص بدون گیومه، YAML نامعتبری تولید میکند که استقرار پیکربندی یا وارد کردن داده را خراب میکند. این مبدل فیلدهای CSV را تجزیه میکند، سرستونها را به کلیدها map میکند و خروجی YAML با تورفتگی و نقلقولگذاری صحیح تولید میکند.
⚡
تبدیل فوری در مرورگر
CSV را بچسبانید یا آپلود کنید و فوری خروجی YAML معتبر دریافت کنید. بدون ابزار CLI برای نصب، بدون کتابخانهای برای import، بدون مرحله build.
🔒
دادههای شما خصوصی میماند
تمام تجزیه و تبدیل بهصورت محلی در مرورگر شما با استفاده از JavaScript اجرا میشود. داده CSV شما هرگز دستگاه شما را ترک نمیکند، هرگز به سرور ارسال نمیشود و هرگز ذخیره یا لاگبرداری نمیشود.
🎯
تولید YAML با فرمت صحیح
خروجی از تورفتگی مناسب استفاده میکند، رشتههایی که در غیر این صورت بهعنوان بولین یا عدد تفسیر میشوند را quote میکند، و YAML 1.2 معتبری تولید میکند که از هر linter یا validator schema عبور میکند.
📋
مدیریت هر گویش CSV
کاما، سمیکالن، تب و پایپ را بهعنوان جداکننده بهطور خودکار تشخیص میدهد. از قوانین نقلقولگذاری RFC 4180 از جمله گیومههای دوتایی escape شده، فیلدهای چندسطری و فایلهای UTF-8 با BOM پشتیبانی میکند.
موارد استفاده تبدیل CSV به YAML
پیکربندی Kubernetes و Docker Compose
بلوکهای متغیر محیطی، بخشهای داده ConfigMap یا تعاریف سرویس Docker Compose را از یک صفحهگسترده مقادیر پیکربندی تولید کنید. خروجی YAML را مستقیماً در فایلهای manifest خود بچسبانید.
دادههای playbook Ansible
فهرست CSV از hostها، نقشها و متغیرها را به فایلهای متغیر با فرمت YAML (group_vars، host_vars) تبدیل کنید که Ansible بدون هیچ افزونه پارس سفارشی بهطور بومی میخواند.
پیکربندی خط لوله CI/CD
یک صفحهگسترده از ورودیهای ماتریس build، متغیرهای محیطی یا اهداف استقرار را به بلوکهای YAML پیکربندی GitHub Actions، GitLab CI یا CircleCI تبدیل کنید. از تایپ دستی تعاریف ماتریس تکراری جلوگیری میکند.
fixtureهای داده اولیه پایگاه داده
Rails، Django و سایر فریمورکها از YAML برای fixtureهای آزمون و داده اولیه استفاده میکنند. یک صادرات CSV پایگاه داده را به یک فایل fixture YAML تبدیل کنید که ORM میتواند مستقیماً در پایگاه داده آزمایشی بارگذاری کند.
تبدیل خط لوله داده
خطوط لوله ETL که ورودی YAML میپذیرند میتوانند داده CSV تبدیلشده را بدون مرحله میانی JSON دریافت کنند. ابزارهایی مانند dbt، Dagster و Prefect از YAML برای تعاریف خط لوله و پیکربندی استفاده میکنند.
یادگیری نحو YAML
دانشجویان و توسعهدهندگان تازهوارد به YAML میتوانند داده CSV آشنا را بچسبانند و ببینند چگونه سطرهای جدولی به آرایهها و مپها تبدیل میشوند. مقایسه ورودی و خروجی قوانین تورفتگی، نحو کلید-مقدار و مدیریت نوع را روشن میکند.
مرجع نگاشت 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 است که از تورفتگی برای تودرتو شدن استفاده میکند، از انواع داده چندگانه پشتیبانی میکند و اجازه نظرات را میدهد. انتخاب به این بستگی دارد که ابزار پاییندست شما چه انتظاری دارد.
CSV
متن ساده، یک رکورد در هر خط. هر مقدار یک رشته است. بدون سلسلهمراتب، تودرتویی یا نظرات. حداقل اندازه فایل. توسط صفحهگستردهها، پایگاههای داده و ابزارهای خط فرمان بهطور جهانی پشتیبانی میشود. توسط RFC 4180 تعریف شده است. بهترین گزینه برای انتقال انبوه داده جدولی بین سیستمهایی که بر ترتیب ستون و نوعها توافق دارند.
YAML
فرمت مبتنی بر تورفتگی با پشتیبانی بومی از رشتهها، اعداد صحیح، اعشاری، بولینها، null، تاریخها، آرایهها و مپها (اشیاء). اجازه نظرات درونخطی با # را میدهد. بهعنوان فرمت پیکربندی اصلی برای Kubernetes، Docker Compose، Ansible، GitHub Actions و اکثر ابزارهای مدرن DevOps استفاده میشود. YAML 1.2 یک superset از JSON است، بنابراین هر JSON معتبری YAML معتبر نیز هست.
نمونههای کد
مثالهای کاربردی در Node.js، Python، Go و ابزارهای CLI. هر کدام سطر سرصفحه CSV را بهعنوان کلیدهای YAML میخواند، هر سطر داده را به یک ورودی آرایه map میکند و quote کردن را برای مقادیر مبهم از نظر نوع مدیریت میکند.
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 (key-value) تبدیل میشود و تمام مپها در یک آرایه YAML جمعآوری میشوند. نتیجه لیستی از اشیاء است که در آن هر کلید از سرصفحه و هر مقدار از محتوای سلول میآید.
با مقادیری مانند «true»، «yes» یا «null» در CSV چه اتفاقی میافتد؟
پارسرهای YAML مقادیر خام true، false، yes، no و null را بهعنوان مقادیر دارای نوع تفسیر میکنند نه رشته. مبدل این مقادیر را quote میکند تا در خروجی بهصورت رشته باقی بمانند. برای مثال، یک سلول CSV حاوی «yes» در خروجی YAML به '"yes"' تبدیل میشود تا ابزار پیکربندی شما آن را بهعنوان بولین تفسیر نکند.
آیا میتوانم YAML را به CSV تبدیل کنم؟
بله، تا وقتی که YAML یک آرایهی تخت از مپها باشد (آرایهای از آبجکتها با مقادیر scalar). ساختارهای YAML با مپهای تودرتوی عمیق یا انواع مختلط نمیتوانند بهصورت تمیز بهعنوان سطرهای CSV نمایش داده شوند. برای ساختارهای تخت، ابزارهایی مانند yq، Miller (mlr) یا ماژولهای yaml و csv پایتون تبدیل معکوس را انجام میدهند.
تفاوت بین تبدیل CSV به YAML و CSV به JSON چیست؟
هر دو داده ساختاریافته از ورودی CSV تخت تولید میکنند. JSON از آکولادها و کروشهها با قوانین نقلقولگذاری سختگیرانه استفاده میکند. YAML از تورفتگی و دونقطه استفاده میکند، از نظرات پشتیبانی میکند و خواندن و ویرایش دستی آن آسانتر است. اکثر ابزارهای DevOps (Kubernetes، Ansible، Docker Compose) انتظار YAML دارند. اکثر APIهای وب و ابزارهای مبتنی بر JavaScript انتظار JSON دارند.
اعداد و تاریخها در خروجی چگونه مدیریت میشوند؟
CSV هر مقدار را بهعنوان رشته در نظر میگیرد. پارسرهای YAML اعداد بدون quote (42، 3.14) و تاریخهای ISO (2024-01-15) را بهصورت خودکار به انواع مربوطه تبدیل میکنند. اگر نیاز دارید همه مقادیر بهصورت رشته باقی بمانند، مبدل میتواند همه مقادیر را quote کند. اگر میخواهید استنتاج نوع انجام شود، مقادیر را بدون گیومه بگذارید و پارسر YAML تشخیص نوع را انجام دهد.
آیا مبدل فایلهای CSV بزرگ را مدیریت میکند؟
ابزار کاملاً در مرورگر شما اجرا میشود، بنابراین عملکرد به حافظه در دسترس و محدودیتهای تب مرورگر بستگی دارد. فایلهای تا چند مگابایت (دهها هزار سطر) روی سختافزار مدرن بدون مشکل تبدیل میشوند. برای فایلهای بسیار بزرگ (۱۰۰ مگابایت و بیشتر)، از یک ابزار CLI مانند ماژولهای csv و yaml پایتون، encoding/csv گو با gopkg.in/yaml.v3، یا Miller (mlr) استفاده کنید که میتوانند داده را بدون بارگذاری کامل در حافظه بهصورت جریانی پردازش کنند.
آیا خروجی YAML 1.1 است یا YAML 1.2؟
این ابزار خروجی YAML 1.2 تولید میکند. تفاوت اصلی با YAML 1.1 این است که نسخه 1.2 «مشکل نروژ» را کنار گذاشت (که در آن 'no' خام بهعنوان false بولین تفسیر میشد) و سازگاری JSON خود را همراستا کرد. اکثر پارسرهای مدرن (Go yaml.v3، Python PyYAML با safe_load، Ruby Psych) از YAML 1.2 پشتیبانی میکنند. اگر ابزار شما به سازگاری با نسخه 1.1 نیاز دارد، خروجی در تقریباً تمام موارد بهدرستی تجزیه میشود چرا که نسخه 1.2 برای ساختارهای رایج با نسخههای قدیمی سازگار است.