CSV→Markdownテーブル変換
CSVをMarkdownテーブルに変換します
CSV入力
Markdown出力
CSVからMarkdownへの変換とは?
CSVをMarkdownテーブルに変換することは、開発者がよく行う作業です。CSV(Comma-Separated Values)は、各行が1レコードを表し、フィールドがカンマやタブなどの区切り文字で区切られたプレーンテキストの表形式データです。スプレッドシート・SQLクライアント・分析ツールのデフォルトエクスポート形式として広く使われています。CSVファイルはコンパクトで生成しやすい一方、データの表示方法を制御する仕組みを持っていません。テキストエディターで開くと、カンマ区切りの文字列が並んだだけの内容になり、機械には読みやすくても人間には把握しづらいものです。
Markdownテーブルはこの可読性の問題を解決します。GitHub Flavored Markdown(GFM)仕様で定義されており、GitHub・GitLab・Bitbucket・Notion・Obsidian・Hugo・JekyllなどのMarkdownを処理する環境でHTMLテーブルとしてレンダリングされます。構文はパイプ文字で列を区切り、ヘッダー行と本文行の間にダッシュで構成された必須の区切り行を入れます。
CSVをMarkdownテーブルに変換するとは、各行をパイプ区切りの構文で囲み、ヘッダーの後に区切り行を挿入する処理です。CSVの最初の行がテーブルのヘッダーになり、以降の行が本文行になります。README・プルリクエストの説明・Wikiページ・Markdownドキュメントシステムに構造化データを貼り付けるときに必要な操作です。
このツールを使う理由
このコンバーターはブラウザ上でCSVを解析し、Markdownテーブルを即座に生成します。データがサーバーに送信されることはありません。
CSVからMarkdownへの変換ユースケース
Markdownテーブル構文リファレンス
MarkdownテーブルはGitHub Flavored Markdown(GFM)仕様に従います。すべてのテーブルにはヘッダー行・区切り行・1行以上の本文行が必要です。区切り行で列の配置を制御します。
| 要素 | 構文 | 説明 |
|---|---|---|
| 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 |
CSVとMarkdownテーブルの比較
どちらのフォーマットもプレーンテキストで表形式データを表現します。CSVは機械やデータパイプライン向け、Markdownテーブルはドキュメントを読む人間向けです。
コード例
以下の例は、各言語でCSVをMarkdownテーブルにプログラム的に変換する方法です。いずれも有効なGFMテーブルを生成します。
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