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