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関数・文字列の分割
