「markdownテーブルを雑にcsvに戻してくれるくん」をワンライナーで雑に書いた

## 動機（読まないでいい）
- CLIからmarkdownの表（テーブル）を作るのには、個人的に[AxlLind/mdtable-cli]が最強なのではと勝手に思っていた
	- 今年四月の頭ごろに入れたのだけど、いまだに便利に使えている
		- 出力フォーマットが普通にきれい（いい感じによく見るようなスタイルでスペースが挿入される）
		- ファイルはもちろん標準入力からも読んでくれるし、引数なしなら標準入力が開くので適当にインタラクティブに入力して`Ctrl-z`で完了・作成的なこともできる
		- Rust製なので管理が楽（なおWindowsの場合`cargo install`する必要があるが、普通に動く）
		- おまけ程度にしか使わないけど`-m`でminimize出力もできる
		- `-s`オプションを使ってもtsvは処理できないっぽいのはご愛敬
			- `\t`だかを指定したら読み込み自体はできていたように見えた（それをセパレータとして分割するのに失敗していた）ように見えたので、いつか直したい
	- もちろん`:%!mdtable`とか`:'<,'>!mdtable`とかでVimからも使える
- これを私はいたく気に入っていたのだけど、後に知った似たような機能を持つらしき[mattn/vim-maketable]というvimプラグインには`:UnmakeTable`というコマンドがあるらしい
	- なんだそれは
	- mdtable2csvということか
	- （てかmattnさんいろいろとなんでも作ってるな...）
- 自分の場合そんなに使う機会自体はなさそうだったけど、「tocsvなら正規表現で適当にぱっと置換すればいけそうだよね」となったのを最近思い出したのでやってみた

## 方針案
「おおよそこれでいけるのでは」  
```sh
"^\|"    -> ""
" *\| *" -> ","
"\|$"    -> ""
```

## 材料
これ  
```
| hoge | fuga | piyo |
|------|------|------|
| foo  | bar  | baz  |
```
- csvのカンマのエスケープとか考慮しだすと面倒なのでやらない
	- ただのエスケープでさえ私のような素人には一苦労なのに、csvのカンマエスケープはすごい面倒らしいとどこかで聞いた覚えがあるのでやらない
	- あくまで目視確認するような量しか処理しない前提（雑なので）

## 調理器具
シェル芸っぽいやつ（ただしコマンドプロンプト）でやる  
sed使えないゆとりなので[sd]（sedはいつかやる）  
下処理にtrも使う（Windowsなので代替として[uutils/coreutils]入れてる）  

## 調理
これがあるので
```
| hoge | fuga | piyo |
|------|------|------|
| foo  | bar  | baz  |
```
まずこうする  

```sh
C:\CLI>cat table.md | tr -d \r | sd "^\|" ""
#  hoge | fuga | piyo |
# ------|------|------|
#  foo  | bar  | baz  |
```
行頭の`|`を削除している  

ここで下処理として`\r`を刈っておかないと`$`の行末マッチにかからないので注意  
（改行コードは変わってしまうけど、後からsdで変換もできますので）  
これに気付くのに時間がかかった  
sdはところどころWindows対応が甘いところがあるという記憶だったのだけど、それを見落としていた  

`\n`で行末判定をしてたりするんだろうか  

次にこうする
```sh
C:\CLI>cat table.md | tr -d \r | sd "^\|" "" | sd " *\|$" ""
#  hoge | fuga | piyo
# ------|------|------
#  foo  | bar  | baz
```
今回は行末の`|`（と余分なスペース）を削除している  

その次
```sh
C:\CLI>cat table.md | tr -d \r | sd "^\|" "" | sd " *\|$" "" | sd -- "[-\|]+\n" ""
#  hoge | fuga | piyo
#  foo  | bar  | baz
```
二行目によく入ってるハイフンによる区切り行、これを改行ごと削除している  
<details><summary>なぜこれを最初に持ってこないのか</summary>

なぜこれを最初に持ってこないのかというと、正規表現があまあますぎて行末のパイプ＋改行にもマッチしてしまい、こうなるから  
```sh
C:\CLI>cat table.md | tr -d \r | sd -- "[-\|]+\n" ""
# | hoge | fuga | piyo | foo  | bar  | baz
```
多分ほんとならもっとちゃんとやるところなんだと思う  
（折り畳み終わり）  
</details>

そのまた次、そろそろ終わり  
```sh
C:\CLI>cat table.md | tr -d \r | sd "^\|" "" | sd " *\|$" "" | sd -- "[-\|]+\n" "" | sd " *\| *" ","
#  hoge,fuga,piyo
#  foo,bar,baz
```
ほぼ完成形  
...なのだけど、よく見ると行頭に余計な空白がついてる  

これは見た目が崩れないようにというのと、それによる分かりやすさのためにあえて残しておいたもので、行末パイプの時のようにこうちょっと付け足してやると取れる  
```sh
C:\CLI>cat table.md | tr -d \r | sd "^\| *" "" | sd " *\|$" "" | sd -- "[-\|]+\n" "" | sd " *\| *" ","
# hoge,fuga,piyo
# foo,bar,baz
```
改行コードをcrlfに戻したいのであれば、後ろにパイプで` | sd "\n" "\r\n"`と付け足してやればいいはず  
完成！！  

...思った通り、単純な置換だけでもある程度はちゃんと動くようにできたので良かったです（思った以上にサクッとできた）  
逆方向となるともう少し複雑になってプログラム味が出てくるんでしょうし、今回のでももう少し詰めようはあるとは思うんですけどね  
キャプチャ画像も一応置いときますね  
![mdtable_to_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2327338/1890a0df-a847-2d6c-f83f-21f4ac37140c.png)

## 終わり
終わりです  


[AxlLind/mdtable-cli]: https://github.com/AxlLind/mdtable-cli  
[mattn/vim-maketable]: https://github.com/mattn/vim-maketable
[uutils/coreutils]: https://github.com/uutils/coreutils
[sd]: https://github.com/chmln/sd