CSV取込の場合、単純にカンマで区切って配列を取得するだけのロジックを実装すると様々な弊害が起きます。
よく見られるパターンとしては下記のようなケースでしょう。
- フィールドの中に、カンマがあった場合、意図しない場所で区切ってしまう
- フィールドの中に、改行があった場合、別行としてみなしてしまう。
このような弊害があるため、一般的にはライブラリを使って取り込んだほうが安全です。
Perlの場合、Perl::CSV_XSというライブラリが有名です。
http://perldoc.jp/docs/modules/Text-CSV_XS-0.23/Text-CSV_XS-0.23.pod
上記のようなエラーを回避しつつ、CSVを取り込むコードとしては下記のような書き方がベターです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
my $file ="ファイルパス" my $io = IO::File->new($file, "r") or confess "Error: $file $!\n"; #binaryを入れておかないとフィールド内の改行に対応できない my $csv = Text::CSV_XS->new({binary=>1}); #文字コードの判定を行う open my $io, "<:encoding(sjis)", $file or die $!; my $headers = "ヘッダーの定義を行う"; while ( my $items = $csv->getline($io) ) { #空行の判定 if( scalar( @$items) == 0 ) { next; } my $record; for (my $i = 0; $i < scalar(@$headers); $i++) { my $name = $headers->[$i]; my $value = $items->[$i]; $record->{$name} = $value; } push(@rows, $record); } #ポインタの開放 $io->close(); |
参考リンク
おまけ:Perlでの金額表示の際にカンマを入れたいときは?(リンクのみ)