2012.10.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2012.10.01)

$ [Perl] ライブラリ無し縛り - CSVパース

  • ダブルクォーテーションに囲まれた文字列中の改行、カンマを区切り文字として扱わない
  • ライブラリは使わない。インタプリタの機能のみを使う

OK~

&csvparse( sub{ <DATA> } , sub{ print map("[$_]",@{$_[0]}),"\n"; } );

sub csvparse{
    my ($read,$callback)=@_;
    while( defined(my $line=$read->()) ){
        for(;;){
            $line =~ s/"([^"]+)"/"\a".unpack('h*',$1)."\a"/ge;
            last unless $line =~ /"/ && defined(my $next = $read->());
            $line .= $next;
        }
        chomp $line;
        my @csv = split(/,/,$line);
        s/\a([^\a]+)\a/pack('h*',$1)/ge foreach( @csv );
        $callback->( \@csv );
    }
}
__END__
nihon,go ahaha,ihihi
ahaha,"ihihi , ufufu","ohoho
mumumu
ahaha
gahaha"
XXXXX,"YYYYY","DDDDD,XXXXXX"
  • CSV解析関数 csvparse の第一引数は、1行を取得するクロージャを渡す。
  • 第二引数は分解した CSV を引き渡すクロージャーを渡す。
$ perl csv.pl
[nihon][go ahaha][ihihi]
[ahaha][ihihi , ufufu][ohoho
mumumu
ahaha
gahaha]
[XXXXX][YYYYY][DDDDD,XXXXXX]
.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー