ToolDeck

Chuyển đổi CSV sang YAML

Chuyển đổi dữ liệu CSV thành mảng đối tượng YAML

Thử ví dụ

Đầu vào CSV

Đầu ra YAML

Chạy cục bộ · An toàn để dán thông tin bí mật
Đầu ra YAML sẽ hiển thị ở đây…

Chuyển đổi CSV sang YAML là gì?

Chuyển đổi CSV sang YAML biến dữ liệu dạng bảng phân cách bằng dấu phẩy thành định dạng YAML (YAML Ain't Markup Language). Mỗi hàng của tệp CSV trở thành một phần tử trong một chuỗi YAML, và mỗi tiêu đề cột ánh xạ thành một khóa trong một ánh xạ YAML. Kết quả là một tài liệu dễ đọc dựa trên thụt lề mà các công cụ cấu hình và pipeline dữ liệu có thể phân tích trực tiếp mà không cần tệp schema bổ sung.

YAML được đề xuất lần đầu vào năm 2001 và đạt đến đặc tả hiện tại (YAML 1.2) vào năm 2009. Đây là định dạng cấu hình mặc định cho các manifest Kubernetes, tệp Docker Compose, playbook Ansible, workflow GitHub Actions và nhiều hệ thống CI/CD. Khi dữ liệu nguồn của bạn nằm trong bảng tính hoặc bản xuất cơ sở dữ liệu, việc chuyển đổi CSV sang YAML là cách nhanh nhất để tạo các mục cấu hình, dữ liệu seed fixture, hoặc đầu vào kiểm thử cho các hệ thống này.

Một công cụ chuyển đổi CSV sang YAML đúng chuẩn phải xử lý các quy tắc phân tích RFC 4180: các trường được trích dẫn chứa dấu phẩy hoặc ký tự xuống dòng, dấu ngoặc kép được thoát, và các dấu phân cách khác nhau. Về phía YAML, các chuỗi trông giống boolean (yes, no, true, false), số, hoặc null phải được trích dẫn để ngăn bộ phân tích YAML chuyển đổi chúng thành các kiểu dữ liệu không mong muốn. Công cụ cũng cần xử lý nội dung Unicode và tạo đầu ra UTF-8 hợp lệ, vì YAML 1.2 yêu cầu UTF-8 là mã hóa mặc định.

Tại sao nên dùng công cụ chuyển CSV sang YAML?

Viết tay YAML từ dữ liệu bảng tính rất tẻ nhạt và dễ mắc lỗi. Một thụt lề sai chỗ hoặc một ký tự đặc biệt không được trích dẫn sẽ tạo ra YAML không hợp lệ làm hỏng quá trình triển khai cấu hình hoặc nhập dữ liệu. Công cụ chuyển đổi này phân tích các trường CSV, ánh xạ tiêu đề thành khóa, và tạo đầu ra YAML được thụt lề và trích dẫn đúng chuẩn.

Chuyển đổi tức thì trong trình duyệt
Dán hoặc tải lên dữ liệu CSV và nhận đầu ra YAML hợp lệ ngay lập tức. Không cần cài đặt công cụ CLI, không cần nhập thư viện, không cần bước build.
🔒
Giữ dữ liệu của bạn riêng tư
Toàn bộ quá trình phân tích và chuyển đổi chạy cục bộ trong trình duyệt của bạn bằng JavaScript. Dữ liệu CSV không bao giờ rời khỏi máy của bạn, không bao giờ được gửi đến máy chủ, và không bao giờ được lưu trữ hay ghi nhật ký.
🎯
Tạo YAML được định dạng đúng chuẩn
Đầu ra sử dụng thụt lề đúng chuẩn, trích dẫn các chuỗi có thể bị hiểu nhầm là boolean hoặc số, và tạo YAML 1.2 hợp lệ vượt qua mọi linter hoặc bộ kiểm tra schema.
📋
Xử lý mọi cấu trúc CSV
Tự động phát hiện dấu phẩy, dấu chấm phẩy, tab và pipe làm dấu phân cách. Hỗ trợ quy tắc trích dẫn RFC 4180 bao gồm dấu ngoặc kép được thoát, các trường nhiều dòng và tệp UTF-8 có tiền tố BOM.

Các trường hợp sử dụng CSV sang YAML

Cấu hình Kubernetes và Docker Compose
Tạo các khối biến môi trường, phần dữ liệu ConfigMap, hoặc định nghĩa service Docker Compose từ bảng tính các giá trị cấu hình. Dán đầu ra YAML trực tiếp vào các tệp manifest.
Dữ liệu biến Ansible playbook
Chuyển đổi danh sách kiểm kê CSV của host, role và biến thành các tệp biến định dạng YAML (group_vars, host_vars) mà Ansible đọc trực tiếp mà không cần plugin phân tích tùy chỉnh.
Cấu hình pipeline CI/CD
Biến bảng tính các mục build matrix, biến môi trường hoặc deployment target thành các khối cấu hình YAML cho GitHub Actions, GitLab CI hoặc CircleCI. Tránh việc nhập thủ công các định nghĩa matrix lặp đi lặp lại.
Fixture dữ liệu seed cơ sở dữ liệu
Rails, Django và các framework khác dùng YAML cho test fixture và dữ liệu seed. Chuyển đổi bản xuất CSV cơ sở dữ liệu thành tệp fixture YAML mà ORM có thể tải trực tiếp vào cơ sở dữ liệu kiểm thử.
Chuyển đổi trong pipeline dữ liệu
Các pipeline ETL chấp nhận đầu vào YAML có thể nhận dữ liệu CSV đã chuyển đổi mà không cần bước trung gian JSON. Các công cụ như dbt, Dagster và Prefect dùng YAML cho định nghĩa pipeline và cấu hình.
Học cú pháp YAML
Sinh viên và lập trình viên mới làm quen với YAML có thể dán dữ liệu CSV quen thuộc và xem cách các hàng dạng bảng chuyển thành chuỗi và ánh xạ. So sánh đầu vào và đầu ra giúp làm rõ quy tắc thụt lề, cú pháp khóa-giá trị và xử lý kiểu dữ liệu.

Tham khảo ánh xạ CSV sang YAML

Mỗi thành phần cấu trúc của tệp CSV có một đối tượng tương ứng trực tiếp trong YAML.

Khái niệm CSVTương đương YAMLChi tiết
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

So sánh CSV và YAML

CSV là định dạng phẳng phân cách bằng ký tự, không có thông tin kiểu dữ liệu hay phân cấp. YAML là tập cha của JSON sử dụng thụt lề để lồng nhau, hỗ trợ nhiều kiểu dữ liệu và cho phép chú thích. Sự lựa chọn phụ thuộc vào những gì công cụ đầu cuối của bạn yêu cầu.

CSV
Văn bản thuần túy, mỗi bản ghi trên một dòng. Mọi giá trị đều là chuỗi. Không có phân cấp, lồng nhau hay chú thích. Kích thước tệp tối thiểu. Được hỗ trợ bởi bảng tính, cơ sở dữ liệu và các công cụ dòng lệnh. Được định nghĩa theo RFC 4180. Phù hợp nhất cho truyền dữ liệu bảng số lượng lớn giữa các hệ thống đồng ý về thứ tự và kiểu cột.
YAML
Định dạng dựa trên thụt lề với hỗ trợ gốc cho chuỗi, số nguyên, số thực, boolean, null, ngày tháng, chuỗi (mảng) và ánh xạ (đối tượng). Cho phép chú thích nội tuyến với #. Được dùng làm định dạng cấu hình chính cho Kubernetes, Docker Compose, Ansible, GitHub Actions và hầu hết các công cụ DevOps hiện đại. YAML 1.2 là tập cha của JSON, vì vậy mọi JSON hợp lệ cũng là YAML hợp lệ.

Ví dụ mã

Các ví dụ thực tế trong Node.js, Python, Go và các công cụ CLI. Mỗi ví dụ đọc hàng tiêu đề CSV làm khóa YAML, ánh xạ mỗi hàng dữ liệu thành một phần tử chuỗi, và xử lý việc trích dẫn cho các giá trị không rõ kiểu.

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

Câu hỏi thường gặp

Quá trình chuyển đổi CSV sang YAML hoạt động như thế nào?
Công cụ đọc hàng đầu tiên làm tiêu đề cột. Mỗi hàng tiếp theo trở thành một ánh xạ YAML (đối tượng khóa-giá trị), và tất cả các ánh xạ được thu thập thành một chuỗi YAML (mảng). Kết quả là một danh sách đối tượng trong đó mỗi khóa đến từ tiêu đề và mỗi giá trị đến từ nội dung ô.
Các giá trị như "true", "yes" hoặc "null" trong CSV của tôi sẽ được xử lý như thế nào?
Bộ phân tích YAML diễn giải bare true, false, yes, no và null là các giá trị có kiểu thay vì chuỗi. Công cụ trích dẫn các giá trị này để chúng vẫn là chuỗi trong đầu ra. Ví dụ, một ô CSV chứa "yes" sẽ trở thành '"yes"' trong đầu ra YAML, ngăn công cụ cấu hình của bạn hiểu nó là boolean.
Tôi có thể chuyển đổi YAML trở lại CSV không?
Có, miễn là YAML là một chuỗi phẳng các ánh xạ (mảng đối tượng có giá trị vô hướng). Các cấu trúc YAML lồng nhau sâu với các ánh xạ phức tạp hoặc kiểu hỗn hợp không thể được biểu diễn gọn gàng dưới dạng hàng CSV. Với các cấu trúc phẳng, các công cụ như yq, Miller (mlr), hoặc module yaml và csv của Python xử lý được việc chuyển đổi ngược.
Sự khác biệt giữa chuyển đổi CSV sang YAML và CSV sang JSON là gì?
Cả hai đều tạo dữ liệu có cấu trúc từ đầu vào CSV phẳng. JSON dùng dấu ngoặc nhọn và ngoặc vuông với quy tắc trích dẫn nghiêm ngặt. YAML dùng thụt lề và dấu hai chấm, hỗ trợ chú thích, và dễ đọc và chỉnh sửa bằng tay hơn. Hầu hết các công cụ DevOps (Kubernetes, Ansible, Docker Compose) yêu cầu YAML. Hầu hết các web API và công cụ dựa trên JavaScript yêu cầu JSON.
Số và ngày tháng được xử lý như thế nào trong đầu ra?
CSV coi mọi giá trị là chuỗi. Bộ phân tích YAML sẽ tự động phát hiện các số không được trích dẫn (42, 3.14) và ngày ISO (2024-01-15) là các kiểu tương ứng. Nếu bạn muốn tất cả giá trị vẫn là chuỗi, công cụ có thể trích dẫn mọi giá trị. Nếu bạn muốn suy luận kiểu, để các giá trị không được trích dẫn và để bộ phân tích YAML xử lý việc phân giải kiểu.
Công cụ có xử lý được tệp CSV lớn không?
Công cụ chạy hoàn toàn trong trình duyệt của bạn, vì vậy hiệu năng phụ thuộc vào bộ nhớ khả dụng và giới hạn tab trình duyệt. Các tệp đến vài megabyte (hàng chục nghìn hàng) chuyển đổi mà không gặp vấn đề trên phần cứng hiện đại. Với các tệp rất lớn (100MB trở lên), hãy dùng công cụ CLI như module csv và yaml của Python, Go's encoding/csv với gopkg.in/yaml.v3, hoặc Miller (mlr), vốn có thể truyền dữ liệu mà không cần tải tất cả vào bộ nhớ.
Công cụ tạo đầu ra YAML 1.1 hay YAML 1.2?
Công cụ này tạo đầu ra YAML 1.2. Sự khác biệt chính so với YAML 1.1 là 1.2 đã bỏ "vấn đề Na-uy" (bare 'no' bị diễn giải là boolean false) và căn chỉnh khả năng tương thích JSON. Hầu hết các bộ phân tích hiện đại (Go yaml.v3, Python PyYAML với safe_load, Ruby Psych) đều hỗ trợ YAML 1.2. Nếu công cụ của bạn yêu cầu khả năng tương thích 1.1, đầu ra vẫn sẽ phân tích đúng trong hầu hết mọi trường hợp vì 1.2 tương thích ngược với các cấu trúc phổ biến.