結論
Perl のワンライナーを使おう。
最近、知人がこちらの記事をストックしていたので条件反射的に書きます。
CSV ファイルの特定の列を取り出す
やってみる
$ cat member.csv
id,name,age
1,taro,21
2,jiro,18
3,saburo,16
4,shiro,15
5,goro,12
こんなファイルがあって、IDの列だけ取り出して書きのような結果を得たいというお題です。
1
2
3
4
5
先程の記事では結論だけ書くと、cut とsed を組み合わせて
cut -d ',' -f 1 member.csv | sed -e '1d'
こうしようと書いてありました。正しいと思います。
Perl で
perl -nle '@t=split(/,/);print $t[0] if $t[0] =~ /\d.*/' members.csv
cut & sed より少し長いですがいくつかのメリットがあります。
まず直感的ですよね。(感覚は人にもよると思いますが)
「カンマでスプリット(分割)して、そのうちの0番目(先頭)がもし数値であれば、それを出力してね。」
という風に、まるで自然言語を読む感覚で理解できます。
そして次のメリットとして、応用が効きます。
例えばそのID に全て ()
をつけて欲しいという依頼があれば、プログラミング的にはただの文字列の連結が追加されるだけですから、先程のを少し改良して
perl -nle '@t=split(/,/);print "(".$t[0].")" if $t[0] =~ /\d.*/' members.csv
(1)
(2)
(3)
(4)
(5)
こう書けばよいだけですし、偶数列だけ出力したいなんていわれれば
perl -nle '@t=split(/,/);print $t[0] if $t[0] =~ /\d.*/ && $t[0] % 2 == 0' members.csv
このように改良すればよい。
2
4
Perl はどこにでもだいたいある
最後に、cut やsed もどの環境にでもだいたいあるとは思いますが、Perl も負けじとだいたいどの環境にもあります。Mac でもLinux でも。ですから、上記のワンライナーは、Mac やUbuntu を使っている方であれば、そのまますぐに実行できます。そういう意味でもおすすめです。
cut やsed の魔法をつかいこなせるのは格好いいかもしれませんが、僕が思うに、利用範囲が狭い -> 利用頻度が低い -> 覚えにくい -> 毎回使い方をググるってことになりかねません。
その点Perl であれば応用範囲が広くて、使用頻度が高くなるので、結果的に手に馴染むと思います。いかがでしょうか。