CSVの値取得
Text::CSV_XSモジュールを使うとCSVデータを簡単に読み込むことができます。
use strict; use warnings; use v5.10; use Text::CSV_XS; my $csv_file = 'testdata.csv'; my $csv = Text::CSV_XS->new({binary => 1}); open my $fh, "<", $csv_file or die "$csv_file:$!"; while (my $row = $csv->getline($fh)) { foreach my $item (@$row) { say "[$item]"; } } close $fh;取得用の関数を作ってみました。単にカンマで区切るだけで良いのであればsplitで簡単に取得できます。
###### # カンマ区切りのデータを分割するための関数と # この関数を使用するサンプル ###### $MODE_DQ_OFF = 0; # "で囲まれたデータの"を削除する $MODE_DQ_ON = 1; # "で囲まれたデータの"をそのままにする ###### # カンマでデータを分割する関数 ###### sub csv_split { my ($line, $mode) = @_; my @data = (); my $tmp; while ($line =~ m/"([^"]*(("")+[^"]*)*)"(?:,|$)|([^,]+)(?:,|$)|(),/g) { if (defined $1) { $tmp = $1; # "で囲まれたデータ if ($mode == $MODE_DQ_OFF) { $tmp =~ s/""/"/g; # "で囲まれたデータは"を""であらわす } else { $tmp = qq("$tmp"); # "で囲みなおす } } elsif (defined $4) { $tmp = $4; # 普通のデータ } else { $tmp = $5; # 空データ } push @data, $tmp; } if ($line =~ m/,$/) { push @data, ""; # ,が最後にきているときは空データを追加 } return @data; } ###### # サンプルプログラム ###### my @data = <>; chomp @data; my @items; print "----- ダブルクォート削除 -----\n"; foreach $line (@data) { print "[$line]\n"; @items = csv_split($line, $MODE_DQ_OFF); # ダブルクォート削除 print "\t"; foreach $item (@items) { print "($item)"; } print "\n"; } print "\n"; print "----- ダブルクォートそのまま -----\n"; foreach $line (@data) { print "[$line]\n"; @items = csv_split($line, $MODE_DQ_ON); # ダブルクォートそのまま print "\t"; foreach $item (@items) { print "($item)"; } print "\n"; } print "\n"; print "----- 単純にカンマで分割 -----\n"; foreach $line (@data) { print "[$line]\n"; @items = split(/,/, $line); # 単純にカンマで分割 print "\t"; foreach $item (@items) { print "($item)"; } print "\n"; } exit 0;サンプルデータと出力結果
関連項目
・split関数・文字列の分割