logo
Published on

csvtomdでコマンドラインでCSV(TSV)をMarkdownテーブルへ変換

Authors

プログラミングやパソコン上の作業において、CSV形式のファイルを扱う場面は多々あります。この記事では、"csvtomd"パッケージを活用し、コマンドライン上からCSV(TSV)形式のファイル・CSVデータ、をHTML互換のMarkdownテーブルへ変換する方法について紹介します。

https://yuis.xsrv.jp/data/DYpQiIcon6u1GBMsPbl2Yid2sXhVjhpC.png
sudo apt update ; sudo pip3 install csvtomd
mplewis/csvtomd: 📝📊 Convert your CSV files into Markdown tables.

CSVをMarkdownテーブルへ変換

以下のようなCSVは

_,リロード,ファイル削除,更新日順ソート,重さ,読み込みファイル制限
nomacs,不可,DEL,可能,軽い,不可
gwenview,F5,DEL,可能,重い,一部可能

以下のように簡単に変換できます。

$ csvtomd hoge.csv
_         |  リロード  |  ファイル削除  |  更新日順ソート  |  重さ  |  読み込みファイル制限
----------|--------|----------|-----------|------|------------
nomacs    |  不可    |  DEL     |  可能       |  軽い  |  不可
gwenview  |  F5    |  DEL     |  可能       |  重い  |  一部可能

TSV(またはその他デリミタ)をMarkdownテーブルへ変換

以下のようなタブがデリミタのTSVを変換したい場合。

_   リロード    ファイル削除  更新日順ソート 重さ  読み込みファイル制限
nomacs  不可  DEL 可能  軽い  不可
gwenview    F5  DEL 可能  重い  一部可能

csvtomdにはデリミタを指定するオプションが実装されてはいるのですが、

$ csvtomd -d "\t" fuga.csv
...
TypeError: "delimiter" must be a 1-character string

といった具合に謎のエラーになります。ちょっと何言ってるのかよくわからない。

こうなるかもしれないことは予想していたので、解決策はすぐに思いつきました。xsvを使うことです。

BurntSushi/xsv: A fast CSV command line toolkit written in Rust.

先述のTSVデータはxsvを使うことでCSVへと変換することができます。

$ cat fuga.csv  | xsv fmt -d "\t" --quote-always -t ","
"_","リロード","ファイル削除","更新日順ソート","重さ","読み込みファイル制限"
"nomacs","不可","DEL","可能","軽い","不可"
"gwenview","F5","DEL","可能","重い","一部可能"

これを標準入力から渡してやればこの通り。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_650287da-08fb-4b0b-8eb5-68787dbb03bd.png
$ csvtomd <<< "$( cat hoge.csv  | xsv fmt -d "\t" --quote-always -t "," )"
_         |  リロード  |  ファイル削除  |  更新日順ソート  |  重さ  |  読み込みファイル制限
----------|--------|----------|-----------|------|------------
nomacs    |  不可    |  DEL     |  可能       |  軽い  |  不可
gwenview  |  F5    |  DEL     |  可能       |  重い  |  一部可能

一応出力されたMarkdownの有効性を確かめておきます。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_d31372d7-abf6-45bc-88fd-0ded912ba093.png

ちゃんとレンダリングされてますね。