GitHub の README・Notion・Zenn・Qiita などに表を掲載したいとき、CSV や Excel のデータをそのまま貼り付けることはできません。Markdown テーブル形式に変換する必要があります。
この記事では、CSV・Excel のデータを Markdown テーブルに変換する方法を、手動・自動の両面から解説します。
Markdown テーブルの記法
Markdown テーブルは以下の形式で記述します。
| 列1 | 列2 | 列3 |
|-----|-----|-----|
| A | B | C |
| D | E | F |
ルールは次のとおりです。
- 各列を
|(パイプ)で区切る - 1行目がヘッダー行
- 2行目は区切り行(
---で構成) - 3行目以降がデータ行
列の幅を揃えなくても動作しますが、揃えると可読性が上がります。
列の配置指定
区切り行のコロン(:)の位置で列の配置を指定できます。
| 左揃え | 中央揃え | 右揃え |
|:-------|:-------:|-------:|
| A | B | C |
CSV から Markdown テーブルへの変換手順(手動)
データ量が少なければ手動でも変換できます。以下の CSV データを例に説明します。
名前,部署,役職
田中太郎,開発部,エンジニア
鈴木花子,営業部,マネージャー
佐藤一郎,人事部,担当
手順
- 1行目(ヘッダー)を
| 名前 | 部署 | 役職 |の形式に変換する |-----|-----|-----|の区切り行を追加する(列数に合わせる)- 各データ行を
| 田中太郎 | 開発部 | エンジニア |の形式に変換する
変換後の Markdown テーブル:
| 名前 | 部署 | 役職 |
|------|------|------|
| 田中太郎 | 開発部 | エンジニア |
| 鈴木花子 | 営業部 | マネージャー |
| 佐藤一郎 | 人事部 | 担当 |
Excel から変換する方法
Excel のセルをコピーすると、タブ区切り(TSV 形式)でクリップボードにコピーされます。これを利用します。
- Excel でコピーしたいセル範囲を選択してコピー
- テキストエディタ(メモ帳など)に貼り付けると、タブ区切りのデータが得られる
- このタブ区切りデータを変換ツールに貼り付けると Markdown テーブルに変換できる
Google スプレッドシートも同様に、セルをコピーするとタブ区切りでクリップボードに入ります。
プログラムで変換する方法
Python
import csv
import io
def csv_to_markdown(csv_text):
reader = csv.reader(io.StringIO(csv_text.strip()))
rows = list(reader)
if not rows:
return ""
# ヘッダー行
header = "| " + " | ".join(rows[0]) + " |"
# 区切り行
separator = "| " + " | ".join(["---"] * len(rows[0])) + " |"
# データ行
data = "\n".join("| " + " | ".join(row) + " |" for row in rows[1:])
return "\n".join([header, separator, data])
csv_text = """名前,部署,役職
田中太郎,開発部,エンジニア
鈴木花子,営業部,マネージャー"""
print(csv_to_markdown(csv_text))
JavaScript
function csvToMarkdown(csv) {
const rows = csv.trim().split('\n').map(row => row.split(','));
const header = '| ' + rows[0].join(' | ') + ' |';
const separator = '| ' + rows[0].map(() => '---').join(' | ') + ' |';
const body = rows.slice(1)
.map(row => '| ' + row.join(' | ') + ' |')
.join('\n');
return [header, separator, body].join('\n');
}
const csv = `名前,部署,役職
田中太郎,開発部,エンジニア
鈴木花子,営業部,マネージャー`;
console.log(csvToMarkdown(csv));
シェルスクリプト(awk)
awk -F',' '
NR==1 {
printf "| "
for(i=1; i<=NF; i++) printf "%s%s", $i, (i1 {
printf "| "
for(i=1; i<=NF; i++) printf "%s%s", $i, (i
TSV(タブ区切り)から変換する場合
Excel や Google スプレッドシートからコピーしたデータはタブ区切り(TSV)です。区切り文字をタブに変えるだけで対応できます。
# Python: TSV → Markdown テーブル
def tsv_to_markdown(tsv_text):
rows = [row.split('\t') for row in tsv_text.strip().split('\n')]
header = "| " + " | ".join(rows[0]) + " |"
separator = "| " + " | ".join(["---"] * len(rows[0])) + " |"
data = "\n".join("| " + " | ".join(row) + " |" for row in rows[1:])
return "\n".join([header, separator, data])
注意点:特殊文字のエスケープ
CSV のセル内に |(パイプ)が含まれる場合、Markdown テーブルのパーサーが列の区切りと誤認識します。この場合は \| にエスケープする必要があります。
# パイプを含むデータ
| コマンド | 説明 |
|----------|------|
| ls \| grep .txt | .txt ファイルの一覧 | ← \| でエスケープ
また、改行を含むセルは標準の Markdown テーブルでは表現できないため、改行を別の表現(スペースや <br>)に変換する必要があります。
ツールで変換する
手動変換やコード記述が不要な場合は、オンライン変換ツールを使うのが最も手軽です。CSV・TSV・HTML テーブルを貼り付けるだけで Markdown テーブルに変換できます。
テーブル変換ツール(CSV / TSV / HTML → Markdown)
貼り付けるだけで自動変換。列配置(左/中央/右)の指定にも対応。
ツールを使う →
まとめ
- Markdown テーブルは
|で列を区切り、2行目に区切り行(---)を入れる形式 - Excel・Google スプレッドシートからのコピーはタブ区切り(TSV)で得られる
- Python・JavaScript いずれもシンプルなコードで CSV → Markdown 変換が実装できる
- セル内に
|が含まれる場合は\|にエスケープが必要 - ツールを使えばコードなしでワンクリック変換できる