ガイド · CSV → Markdown
CSV から Markdown の表へ
CSV は自分の規則を自分の中に書いていません。どの文字で列を分けるか、引用符がどう振る舞うか、1 行目をヘッダーと見るか —— 全部が約束事で、しかも何種類も流通しています。表がおかしく出るのは、たいてい違う約束事で読んだからです。
ここでは区切り文字の決め方、引用符の働き、そして数字を右に揃える方法を扱います。
列を分けているのはどの文字か
実際のファイルに出てくるのは 4 文字 —— カンマ、セミコロン、タブ、パイプ。セミコロンは思われているより多いです。1.5 を 1,50 と書くところではカンマがすでに使われているので、表計算ソフトはセミコロンに手を伸ばします。
判定は自動で、答えがカンマでなかったときは、どの文字を使ったかを出力が書きます。その 1 行は読む価値があります。ヘッダーの上にタイトル行があるなど、最初の数行に変わったものがあるファイルは読み違えることがあり、気づけるのはここだけです。
外していたら区切り文字を手で指定してください。カンマ、セミコロン、タブ、パイプから選べます。
- 01ファイルを置くか、行をそのまま枠に貼ります。
- 02カンマ以外の区切り文字を検出していないか、出力の上の注記を見ます。
- 036 列あるべき表が 1 列で出たら、区切り文字を自分で選びます。
セルの中に区切り文字そのものがあるとき
二重引用符で囲まれたフィールドは区切り文字を含められ、中の二重引用符 2 つは引用符 1 文字を意味します。これが RFC 4180 で、そのとおりに処理します。ファイルをカンマで単純に割らない理由はまさにこれです。
改行も引用符の中に隠れられます。そしてそれは出力形式とぶつかります。パイプ表の行はちょうど 1 行を占めなければならないからです。だからセル内部の改行は <br> に書き換えられ、2 行の住所は 2 行とも残り、その行が二つに割れることもありません。
セルの文字にある縦棒は \| にエスケープします。これがないと、備考欄の縦棒 1 本で 5 列の行が 6 列になります。
name,note
Bolt,"M6 | 40mm
steel"| name | note |
| --- | --- |
| Bolt | M6 \| 40mm<br>steel |揃えの行
ヘッダーの下のハイフンの行にはコロンを付けられ、それが表示時の列の揃えを決めます。左・中央・右 —— 数字なら右です。
知っておくこと:この設定は列ごとではなく表全体に効きます。列ごとの指定はありません。CSV はどの列が数字かという情報を持っておらず、値から推測すると郵便番号や電話番号、バージョン番号で外すからです。
だからほとんど数字の表なら右を選び、テキストの 1 列だけ手で直してください。混ざっているものは既定のまま。コロンなしのハイフンの行になり、どの表示系も左として扱います。
Item,Cost
Bolt,0.40| Item | Cost |
| ---: | ---: |
| Bolt | 0.40 |ヘッダー行と、ヘッダーがないファイル
既定では 1 行目がヘッダーになります。切ると全行が本文行になります —— ただしヘッダー行自体は消えず、空で出ます。
見た目は変ですが不具合ではありません。Markdown のパイプ表はヘッダー行を持つことが必須です。ヘッダーのない表はそもそも表として解釈されないので、空のヘッダーが「ヘッダーなし」を表しつつ表示できるものを出す唯一の方法です。
後で列名を入れるか、そのままでも構いません。空のヘッダー行は、データの上の細い白い帯として表示されます。
Bolt,12
Nut,12| | |
| --- | --- |
| Bolt | 12 |
| Nut | 12 |列数が揃わない行と、壊れたファイル
列数が違う行は一番多い列数に合わせて埋められ、どの列数を見たかを出力が書きます。この知らせは、たいていもっと手前で何かが壊れている合図です。6 列のファイルに 3 セルの行があるのは、ふつうエスケープされていない引用符が区切り文字を飲み込んだということです。
空行は捨てます。区切り文字だけの行も同じで、末尾の「,,,」の塊はこれです。
値の型は決して変換しません。007 は 007 のままで、1-2 は日付になりません。Excel はそれをやりますが、ここではやりません。値を変えることはあなたのデータを変えることだからです。
ファイル先頭のバイト順マークは外します。1 列目のヘッダーに見えない文字がくっついて出ないようにするためです。
ここでの「大きい」とは
上限は二つ。テキスト 25 MB と、10 万セル —— これは行 × 列なので、6 列のファイルなら 1 万 6 千行あたり、100 列なら千行手前で止まります。
先に当たるのはセル数の上限で、これは解析より表示の問題です。プレビューはセルごとに DOM ノードを作るので、数十万になるとタブが固まります。固まるより断ったほうがましです。
本当にもっと大きいものは、行で分割して 1 つずつ変換し、それぞれにヘッダー行を付けてください。
CSV を置くか行を貼って、数字が右に来るなら揃えを切り替えて、表をコピーする。解析はこのタブの中で起きるので、顧客の書き出しはあなたのディスクに留まります。
CSV → MD