教學 · CSV → Markdown
CSV 轉成一張 Markdown 表格
CSV 內部不寫自己的規則。用哪個字元分欄、引號怎麼算、第一列算不算表頭,全都是約定,而流通著的約定有好幾套。表格出來不對,幾乎總是因為拿錯了那套約定去讀它。
這篇講分隔符號是怎麼定的、引號起什麼作用,以及怎麼讓數字靠右對齊。
是哪個字元在分欄
真實檔案裡常見四種:逗號、分號、定位字元、直線。分號比一般人想的多得多 —— 凡是把一點五寫成 1,50 的地方,逗號早就被佔著,試算表軟體只好去拿分號。
辨識是自動的,而辨識結果不是逗號時輸出會說它用了哪個字元。這一行值得讀 —— 前幾行裡有點特殊東西的檔案(比如表頭上面還有一行標題)會被讀錯,而這就是你發現的方式。
猜錯了就自己指定分隔符號。逗號、分號、定位字元、直線都能選。
- 01把檔案拖進來,或者把幾行直接貼進框裡。
- 02看輸出上方那條提示裡有沒有一個不是逗號的分隔符號。
- 03本該六欄的表格出來只有一欄,就自己把分隔符號選上。
當格子裡就有那個分隔符號
用雙引號包起來的欄位裡可以有分隔符號,而裡面連著兩個引號表示一個真的引號字元。這是 RFC 4180,處理得很正經 —— 這正是不能直接按逗號切開的全部原因。
換行也能躲在引號裡,而這一點跟輸出格式撞上了:直線表格的一列必須正好占一行。所以格子內部的換行改寫成 <br>,兩行的地址兩行都留著,也不會把這一列劈成兩半。
格子文字裡的直線轉義成 \|。不轉的話,備註欄裡一根直線會把一個五欄的列變成六欄。
name,note
Bolt,"M6 | 40mm
steel"| name | note |
| --- | --- |
| Bolt | M6 \| 40mm<br>steel |對齊那一行
表頭下面那行連字號裡可以帶冒號,它決定算繪的時候這一欄怎麼對齊。左、中、右 —— 數字欄要的是最後一個。
有一件事要知道:這個設定對整張表生效,不是按欄設的。這裡沒有分欄控制,因為 CSV 本身不帶「哪欄是數字」這種資訊,而從值裡猜會在郵遞區號、電話號碼和版號上猜錯。
所以一張大部分是數字的表,設成右對齊,然後手工改那一欄文字。混著的就留預設 —— 一行純連字號,所有算繪器都當左對齊。
Item,Cost
Bolt,0.40| Item | Cost |
| ---: | ---: |
| Bolt | 0.40 |表頭列,和沒有表頭的檔案
預設第一列當表頭。關掉之後每一列都是資料列 —— 但表頭列本身不會消失,它會是空的。
看著奇怪,但不是 bug:Markdown 的直線表格必須有一個表頭列。沒有表頭的表格根本不會被解析成表格,所以空表頭是唯一一種既能表達「沒有表頭」又能算繪出東西的寫法。
之後自己把欄名填上,或者就留著 —— 空表頭列算繪出來是資料上方一條細的空條。
Bolt,12
Nut,12| | |
| --- | --- |
| Bolt | 12 |
| Nut | 12 |長短不齊的列,和壞檔案
欄數不一樣的列會補齊到最寬那列,輸出會告訴你它看到了哪幾種欄數。這條提示通常說明上游有東西壞了 —— 一個六欄檔案裡出現三格的列,一般是某個沒轉義的引號把一個分隔符號吞了。
空行會丟掉,包括整行只有分隔符號的行 —— 檔案末尾一堆「,,,」通常就是這個。
值永遠不做型別轉換。007 還是 007,1-2 不會變成日期。Excel 會這麼對你,這個不會,因為改了值就是改了你的資料。
檔案開頭的位元組順序記號會剝掉,這樣第一欄的表頭不會帶著一個看不見的字元。
這裡的「大」是多大
兩個上限。25 MB 文字,還有十萬格 —— 列乘欄,所以一個六欄檔案能到大概一萬六千列,一個一百欄的檔案在一千列左右就停。
格數是你更容易撞上的那個,而它是算繪的限制而不是解析的限制。預覽要給每一格建 DOM 節點,幾十萬個會把分頁卡死。拒掉比卡死好。
真的比這更大就按列切開分別轉 —— 每一份裡都把表頭列重複一遍。
把 CSV 拖進來或者貼幾列進去,數字該靠右就換一下對齊,然後複製表格。解析在這個分頁裡做,所以那份客戶匯出留在你自己的硬碟上。
CSV → MD