コマンドラインというか、バッチファイルというか。
文字のエスケープはハマりがち。
そもそも、TSV(タブ区切り)を、Markdown の テーブルにしたい。
WEB サービスもあるけど、AWK なら簡単に作れるんじゃない?と思って作ってみて、意外とハマったので、メモ。
ハマりポイント
- そもそも、UWSC でクリップボードのテキストを、整形というか、コンバートするツールを使ってる。(今どき UWSC って!)
UWSC 内部で 「
RESULT = DOSCMD( "gawk -f TSV2MD.awk hoge.tsv")
」 とかすれば良いのだが、一行野郎で処理したいと思ったのが、運の尽き。- AWK で、区切りは、FS,OFS で簡単じゃね?と思ったら、$0 は$n を更新しないと、セパレータが更新されないようだ。そのために、 「
$1=$1;
」で更新。 - コマンドラインで「
|
」は、パイプと認識される。エスケープ文字は「^
」
そもそもの、TSV2MD.awk
のソース
BEGIN{ FS="\t"; OFS="|"; # 入力セパレータは タブ 、出力セパレータは、| 縦棒 getline; # 一行目は、ヘッダとして一行読んで、 $1=$1; # $0 を更新(セパレータを更新) print "|" $0 "|"; # 前後に | をつけて、ヘッダを出力 # フィールドの数だけ、区切りを入れる。改行せずに for(i=1; i<=NF; i++){ printf("|---"); } printf("|\n"); # 最後には、| と 改行 } { # ここから2行目以降の処理 $1=$1; # 同じく、$0 を更新して、 print "|" $0 "|"; # 前後に | をつけて、データ行を出力 }
その後に、UWSC に組み込みの為の置換
コメント
、タブ
と、改行
を無くして、一行に
BEGIN{FS="\t"; OFS="|"; getline; $1=$1; print "|" $0 "|"; for(i=1; i<=NF; i++){ printf("|---"); }printf("|\n");}{$1=$1;print "|" $0 "|";}
「|
」 を、「^|
」 に
BEGIN{FS="\t"; OFS="^|"; getline; $1=$1; print "^|" $0 "^|"; for(i=1; i<=NF; i++){ printf("^|---"); }printf("^|\n");}{$1=$1;print "^|" $0 "^|";}
「"
」 を、「\<#DBL>
」 に (本来 UWSC では「<#DBL>
」だが、コマンドラインで展開されることを見越して)
BEGIN{FS=\<#DBL>\t\<#DBL>; OFS=\<#DBL>^|\<#DBL>; getline; $1=$1; print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>; for(i=1; i<=NF; i++){ printf(\<#DBL>^|---\<#DBL>); }printf(\<#DBL>^|\n\<#DBL>);}{$1=$1;print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>;}
UWSC 用に、
「CMD_STR = "gawk <#DBL> ◯◯◯◯ <#DBL> "
」 の中に入れる。
ここは、UWSC のエスケープなので、「\<#DBL>
」でなく、「<#DBL>
」
CMD_STR = "gawk <#DBL>BEGIN{FS=\<#DBL>\t\<#DBL>; OFS=\<#DBL>^|\<#DBL>; getline; $1=$1; print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>; for(i=1; i<=NF; i++){ printf(\<#DBL>^|---\<#DBL>); }printf(\<#DBL>^|\n\<#DBL>);}{$1=$1;print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>;} <#DBL> "
なんじゃこれ。なっが~!
メンテナンス性最悪。オススメしかねるな。
TSV の例
date num str 2022/02/24 10 ABC 2022/02/25 123 hoge 2022/02/26 moge
Markdown Table
|date|num|str| |---|---|---| |2022/02/24|10|ABC| |2022/02/25|123|hoge| |2022/02/26||moge|
表示結果
date | num | str |
---|---|---|
2022/02/24 | 10 | ABC |
2022/02/25 | 123 | hoge |
2022/02/26 | moge |