やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

tsv2tableのコマンド引数を考える

 完成形をめざして。

コマンド引数

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文脈自体がしょぼいのでムリ。

 できるだけ短いタイプ数で実行することが目標だが、そうすると一緒くたになり、わかりづらくなる。トレードオフ

対象環境

$ uname -a
Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux