CSV thành Markdown
Chuyển đổi CSV thành bảng Markdown
Đầu vào CSV
Đầu ra Markdown
Chuyển đổi CSV thành Markdown là gì?
Chuyển đổi CSV thành bảng Markdown là một tác vụ phổ biến của lập trình viên. CSV (Comma-Separated Values — Giá trị phân cách bằng dấu phẩy) lưu trữ dữ liệu dạng bảng dưới dạng văn bản thuần túy, mỗi hàng nằm trên một dòng riêng và các trường được phân tách bằng một dấu phân cách như dấu phẩy hoặc tab. Đây là định dạng xuất mặc định của bảng tính, SQL client và các công cụ phân tích dữ liệu. Tệp CSV gọn nhẹ và dễ tạo, nhưng không có cách tích hợp nào để kiểm soát giao diện hiển thị dữ liệu. Một tệp CSV mở trong trình soạn thảo văn bản chỉ là một khối chuỗi phân cách bằng dấu phẩy — máy móc đọc được nhưng khó con người theo dõi.
Bảng Markdown giải quyết vấn đề khả năng đọc này. Chúng được định nghĩa theo đặc tả GitHub Flavored Markdown (GFM) và được hỗ trợ bởi GitHub, GitLab, Bitbucket, Notion, Obsidian, cũng như các trình tạo trang tĩnh như Hugo và Jekyll — bất cứ nơi nào xử lý Markdown, chúng hiển thị thành bảng HTML gọn gàng. Cú pháp sử dụng ký tự pipe để phân tách các cột và một hàng dấu gạch ngang bắt buộc giữa hàng tiêu đề và các hàng nội dung.
Chuyển đổi CSV thành bảng Markdown nghĩa là bọc mỗi hàng trong cú pháp phân cách bằng pipe và chèn hàng phân cách sau tiêu đề. Hàng đầu tiên của CSV trở thành tiêu đề bảng, mỗi hàng tiếp theo trở thành hàng nội dung. Bạn cần thao tác này bất cứ khi nào dán dữ liệu có cấu trúc vào README, mô tả pull request, trang wiki, hoặc bất kỳ hệ thống tài liệu Markdown nào.
Tại sao sử dụng công cụ này?
Bộ chuyển đổi này phân tích CSV ngay trong trình duyệt, tạo đầu ra bảng Markdown tức thì và không bao giờ truyền dữ liệu của bạn lên máy chủ.
Các trường hợp sử dụng CSV thành Markdown
Tham khảo cú pháp bảng Markdown
Bảng Markdown tuân theo đặc tả GitHub Flavored Markdown (GFM). Mỗi bảng yêu cầu một hàng tiêu đề, một hàng phân cách và một hoặc nhiều hàng nội dung. Hàng phân cách kiểm soát căn chỉnh cột.
| Thành phần | Cú pháp | Mô tả |
|---|---|---|
| Column separator | | | Separates each cell within a row |
| Header row | | Name | Age | | First row of the table, defines column names |
| Separator row | | --- | --- | | Required second row; separates header from body |
| Left align | | :--- | | Default alignment — colon on the left side |
| Center align | | :---: | | Colons on both sides of the dashes |
| Right align | | ---: | | Colon on the right side only |
| Escaped pipe | \| | Use backslash to include a literal pipe in cell text |
So sánh CSV và bảng Markdown
Cả hai định dạng đều biểu diễn dữ liệu dạng bảng dưới dạng văn bản thuần túy. CSV dành cho máy móc và pipeline dữ liệu; bảng Markdown dành cho con người đọc tài liệu.
Ví dụ mã
Các ví dụ dưới đây minh họa cách chuyển đổi CSV thành bảng Markdown theo cách lập trình trong các ngôn ngữ khác nhau. Mỗi ví dụ tạo ra bảng GFM hợp lệ.
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`
const [headerLine, ...rows] = csv.trim().split('\n')
const headers = headerLine.split(',')
const separator = '| ' + headers.map(() => '---').join(' | ') + ' |'
const headerRow = '| ' + headers.join(' | ') + ' |'
const bodyRows = rows.map(row =>
'| ' + row.split(',').join(' | ') + ' |'
)
const markdown = [headerRow, separator, ...bodyRows].join('\n')
// → | name | age | city |
// → | --- | --- | --- |
// → | Alice | 30 | Berlin |
// → | Bob | 25 | Tokyo |import csv
import io
csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""
reader = csv.reader(io.StringIO(csv_string))
rows = list(reader)
headers = rows[0]
lines = []
lines.append('| ' + ' | '.join(headers) + ' |')
lines.append('| ' + ' | '.join('---' for _ in headers) + ' |')
for row in rows[1:]:
lines.append('| ' + ' | '.join(row) + ' |')
print('\n'.join(lines))
# → | name | age | city |
# → | --- | --- | --- |
# → | Alice | 30 | Berlin |
# → | Bob | 25 | Tokyo |
# With pandas (one-liner)
import pandas as pd
df = pd.read_csv(io.StringIO(csv_string))
print(df.to_markdown(index=False))package main
import (
"encoding/csv"
"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 lines []string
lines = append(lines, "| "+strings.Join(headers, " | ")+" |")
sep := make([]string, len(headers))
for i := range sep {
sep[i] = "---"
}
lines = append(lines, "| "+strings.Join(sep, " | ")+" |")
for _, row := range records[1:] {
lines = append(lines, "| "+strings.Join(row, " | ")+" |")
}
fmt.Println(strings.Join(lines, "\n"))
// → | name | age | city |
// → | --- | --- | --- |
// → | Alice | 30 | Berlin |
// → | Bob | 25 | Tokyo |
}# Using Miller (mlr) — convert CSV to Markdown table mlr --icsv --omarkdown cat data.csv # → | name | age | city | # → | --- | --- | --- | # → | Alice | 30 | Berlin | # Using csvtomd (pip install csvtomd) csvtomd data.csv # Using pandas in a one-liner python3 -c " import pandas as pd, sys print(pd.read_csv(sys.argv[1]).to_markdown(index=False)) " data.csv