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

sudo apt update ; sudo pip3 install csvtomd
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","可能","重い","一部可能"
これを標準入力から渡してやればこの通り。

$ csvtomd <<< "$( cat hoge.csv | xsv fmt -d "\t" --quote-always -t "," )"
_ | リロード | ファイル削除 | 更新日順ソート | 重さ | 読み込みファイル制限
----------|--------|----------|-----------|------|------------
nomacs | 不可 | DEL | 可能 | 軽い | 不可
gwenview | F5 | DEL | 可能 | 重い | 一部可能
一応出力されたMarkdownの有効性を確かめておきます。

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