ページ

2013年6月23日日曜日

改行付きcsvのパース

csvからtsvへコンバートが欲しかったのですが、 改行コードが入っているcsvであったため楽にできませんでした。 csvは改行コードがある場合ダブルクォーテンションで囲まれているのが特徴です。
下記のサイトに改行コードが含んでいるcsvをパースする方法がperlありましたので こちら 改変しましてコード化しました。
csv2tsv.pl
#!/usr/bin/perl
use strict;
use warnings;
my $column = '';
while (my $line = ) {
    my $count = 0;
    $line .=  while ($line =~ tr/"// % 2 and !eof(STDIN));
 
    $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
    my @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
    ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
    for $column (@values) {
        $column =~ s/\x0D\x0A|\x0D|\x0A//g;
        print $column, "\t";
    }
    print "\r\n";
}

上記をcsv2tsv.plとしてサンプルを作成いたしました。 test.csv
header1,header2,header3
test1,test2, "test,3"
"test
1",test2,test3 
上記が、サンプル用csvとなります。
cat test.csv | csv2tsv.pl
こちらのサンプルで改行付きcsvをパースできます。