#!/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