#!/usr/bin/env perl
use strict;
use warnings;
my $line = "";
while (<>) {
$line .= $_;
my @dqm = $line =~ /\"/g; # double quote を数える
next if @dqm % 2; # 奇数なら次の行を末尾に足す
chomp $line;
{ # 何かの処理
print "\nINPUT: [$line]\n";
my @c = split_csv($line);
print "RESULT: ".join(", ", map {"($_)[$c[$_]]"} 0..$#c)."\n";
}
$line = "";
}
sub split_csv {
my ($s) = @_;
$s =~ s/""/\x07\x08/g;
my @rv = ("$s," =~ /("[^"]+"|[^,]+|),/gs);
return map {s/^"(.*)"$/$1/gs; s/\x07\x08/"/g; $_} @rv;
}
"ABC",DEF,"GHI,JKL" "AB""C",,"D"",EF","," this,foo that,"foo+ bar",100 "4/ 25","31/ 365" hoge,"hoge","hoge" "hoge",hoge "hoge","hoge/ hoge",hoge
% ./csv.pl csv-test.txt INPUT: ["ABC",DEF,"GHI,JKL"] RESULT: (0)[ABC], (1)[DEF], (2)[GHI,JKL] INPUT: ["AB""C",,"D"",EF",","] RESULT: (0)[AB"C], (1)[], (2)[D",EF], (3)[,] INPUT: [this,foo] RESULT: (0)[this], (1)[foo] INPUT: [that,"foo+ bar",100] RESULT: (0)[that], (1)[foo+ bar], (2)[100] INPUT: ["4/ 25","31/ 365"] RESULT: (0)[4/ 25], (1)[31/ 365] INPUT: [hoge,"hoge","hoge"] RESULT: (0)[hoge], (1)[hoge], (2)[hoge] INPUT: ["hoge",hoge] RESULT: (0)[hoge], (1)[hoge] INPUT: ["hoge","hoge/ hoge",hoge] RESULT: (0)[hoge], (1)[hoge/ hoge], (2)[hoge]
perl -nle '$,="\t";$_.=",";s/""/\t/g;print
map{s/^"(.*)"$/$1/g;s/\t/"/g;$_}/("[^"]+"|[^,]+|),/g;' csv-test.txt