完成形をめざして。
コマンド引数
TSVからHTMLのtableに変換する。 usage: cat a.tsv | tsv2table [types] [options] tsv2table [types] [options] a.tsv types: g|group-header 外側にヘッダがある。ヘッダはセル結合で包含関係を表せる。 i|inner-header 内側にヘッダがある。 n|none-header ヘッダなし。 options: common -d|--delimiter '\t', ','。を指定することでTSV,CSVを解析できる。 ファイルパスが指定されているときは拡張子で特定する。 -T|--table-attributes table要素の属性 -l|--logging-level ログ出力する。指定したレベル以上のもののみ出力する。 c|critical ユーザに対する致命的なエラー。 e|error ユーザに対するエラー。 w|warnning ユーザに対する警告。 i|info ユーザに対する有効な情報。 d|debug 全ログ出力する。デバッグ用。 group-header [-H a|r|c|m] [-r t|b|B] [-c l|r|B] -H|--header a|auto ヘッダを推測する。(1行目先頭が空なら列ヘッダあり。1行目に空があれば複数行ヘッダ。) r|row 行ヘッダがある。 c|column 列ヘッダがある。 m|matrix 行・列ヘッダがある。 -r|--row t|top 行ヘッダを最上端に表示する。 b|bottom 行ヘッダを最下端に表示する。 B|Both 行ヘッダを最上下端に表示する。 -c|--column l|left 列ヘッダを最左端に表示する。 r|right 列ヘッダを最右端に表示する。 B|Both 列ヘッダを最左右端に表示する。 -R|--row-header-attributes 行ヘッダに指定した属性を付与する -C|--column-header-attributes 列ヘッダに指定した属性を付与する inner-header [-H c|r] [-s 1..N] [-S 1..N] -H|--header c|column 指定した列の位置がヘッダになる。 r|row 指定した行の位置がヘッダになる。 -s|--start ヘッダ開始位置。 -S|--step ヘッダを飛ばす。 -A|--header-attributes 全ヘッダに指定した属性を付与する examples: cat a.tsv | tsv2table; # ヘッダが外側にある cat a.csv | tsv2table; # ヘッダが外側にある tsv2table a.tsv; # ヘッダが外側にある tsv2table a.csv; # ヘッダが外側にある echo -e '\tA\tB\n1\ta\tb\n2\tc\td' | tsv2table; # ヘッダが外側にある echo -e ',A,B,1,a,b\n2,c,d' | tsv2table -d ','; # ヘッダが外側にある tsv2table -H c a.tsv; # 列ヘッダのみ左側にある tsv2table -H c -c r a.tsv; # 列ヘッダのみ右側にある tsv2table -H c -c B a.tsv; # 列ヘッダのみ左右にある tsv2table n a.tsv; # ヘッダがない tsv2table i -H c -s 1 -S 1 a.tsv; # 奇数列の全行がヘッダである tsv2table i -H c -s 2 -S 1 a.tsv; # 偶数列の全行がヘッダである tsv2table i -H r -s 1 -S 1 a.tsv; # 奇数行の全列がヘッダである tsv2table i -H r -s 2 -S 1 a.tsv; # 偶数行の全列がヘッダである tsv2table i -H c -s 1 -S 3 a.tsv; # 1列目から3列毎に全行がヘッダである tsv2table i -H r -s 1 -S 3 a.tsv; # 1行目から3行毎に全列がヘッダである
方針
- できるだけデフォルト値を指定して省略できるようにする
- 最も頻繁に使うであろう値をデフォルトにする
除外
一度に複数ファイルを対象にすることはしない。
tsv2table [OPTIONS] *.tsv tsv2table [OPTIONS] **/*.tsv
なぜなら出力先を各ファイルごとに分岐できないから。もしファイルパスをキーにした辞書型で返せるなら、それもいい。だが、stdoutで返すだけなので辞書型などのデータ構造が使えない。よって1実行あたり1ファイル1テーブルを対象とする。
所感
ちょっと複雑。複数の文脈に対するオプションが入り乱れているから。たとえば-d
はシェル文脈で、-T
はHTML文脈で、-H
はこのアプリの文脈。
うまくまとめたいが、CLI文脈自体がしょぼいのでムリ。
できるだけ短いタイプ数で実行することが目標だが、そうすると一緒くたになり、わかりづらくなる。トレードオフ。
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux