Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題59

問題59 CSVの列数の調査

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

ダブルクォートのエスケープがたくさん出てきてこんがらがってしまった。こういうのはかなり苦手で理解に時間がかかった。適当なプログラミング言語のライブラリを使えばこういったデータは簡単にさばけるらしい。

解答例は

cat data.csv | grep -Eno '[^,"]*|"([^"]*("")*)*"' | sed 's/:.*//'| uniq -c | awk '$1==2{print $2}'

となる。この正規表現が難しい。| の左側は簡単で、これは単にダブルクォートが含まれていないCSVの値を抽出しているだけである。右側が難しい。右側は ([^"]*("")*) のかたまりがダブルクォートを含まない文字列の後にエスケープされたダブルクォートが(0回以上)現れるということを表している。*がついているのでうまく処理がなされている。最後に全体を""でくくってCSVの値としている。