Text-CSV_XS
view release on metacpan or search on metacpan
t/71_strict.t view on Meta::CPAN
$status = $csv->parse ('a|b|c"d"e'); # Loose unescaped quote
is (0 + $csv->error_diag, 2034, "Previous error still actual");
}
open my $fh, ">", $tfn or die "$tfn: $!\n";
print $fh <<"EOC";
1,foo
2,bar,fail
3,baz
4
5,eox
EOC
close $fh;
open $fh, "<", $tfn or die "$tfn: $!\n";
my @rpt;
$csv = Text::CSV_XS->new ({ strict => 1, auto_diag => 1 });
$csv->callbacks (error => sub {
my ($err, $msg, $pos, $recno, $fldno) = @_;
if ($err == 2014) {
push @rpt => [ $recno, $fldno, $pos ];
$csv->SetDiag (0);
}
});
is_deeply ([ $csv->getline_all ($fh), @rpt ],
[[[ 1, "foo" ], [ 2, "bar", "fail" ], [ 3, "baz" ], [ 4 ], [ 5, "eox" ]],
[ 2, 3, 12 ], [ 4, 1, 3 ]], "Can catch strict 2014 with \$csv");
close $fh;
open $fh, "<", $tfn or die "$tfn: $!\n";
@rpt = ();
$csv = Text::CSV_XS->new ({ strict => 1, auto_diag => 1, callbacks => {
error => sub {
my ($err, $msg, $pos, $recno, $fldno) = @_;
if ($err == 2014) {
push @rpt => [ $recno, $fldno, $pos ];
Text::CSV_XS->SetDiag (0);
}
}}});
is_deeply ([ $csv->getline_all ($fh), @rpt ],
[[[ 1, "foo" ], [ 2, "bar", "fail" ], [ 3, "baz" ], [ 4 ], [ 5, "eox" ]],
[ 2, 3, 12 ], [ 4, 1, 3 ]], "Can catch strict 2014 with class");
close $fh;
# Under strcict, fail un not enough fields.
# Under non-strict expect the value of the previous record
foreach my $test (
[ "a,b,c\n" . "d,e,f\n". "g,h\n". "i,j,k\n",
"a,b,c\n" . "d,e,f\n". "g,h,f\n". "i,j,k\n", 2, 5 ],
[ "a,b,c\n" . "d,e,f\n". "g,h\n" ,
"a,b,c\n" . "d,e,f\n". "g,h,f\n" , 2, 5 ],
[ "a,b,c\n" . "g,h\n". "i,j,k\n",
"a,b,c\n" . "g,h,c\n". "i,j,k\n", 1, 5 ],
[ "a,b\n" . "d,e,f\n". "g,h\n". "i,j,k\n",
"a,b,*\n" . "d,e,f\n". "g,h,f\n". "i,j,k\n", 1, 5 ],
) {
my ($dta, $dta0, $err_line, $pos) = @$test;
open $fh, ">", $tfn or die "$tfn: $!\n";
print $fh $dta;
close $fh;
my $expect = [ map {[ split m/,/ => $_ ]} grep m/\S/ => split "\n" => $dta0 ];
foreach my $strict (0, 1) {
open $fh, "<", $tfn or die "$tfn: $!\n";
my $csv = Text::CSV_XS->new ({ strict => $strict });
my ($r1, $r2, $r3) = ("-", "+", "*");
$csv->bind_columns (\($r1, $r2, $r3));
my @out;
eval {
while ($csv->getline ($fh)) {
push @out => [ $r1, $r2, $r3 ];
}
};
close $fh;
my @err = $csv->error_diag;
if ($strict) {
is ($err[0], 2014, "ENF");
splice @$expect, $err_line;
}
else {
is ($err[0], 2012, "EOF");
}
is_deeply (\@out, $expect, "Bound + strict = $strict");
}
}
{ ok (my $csv = Text::CSV_XS->new ({ strict => 1 }), "Issue#58 data first");
ok ($csv->column_names (qw( A B C )), "Expect 3 colums");
is_deeply ($csv->getline_hr (*DATA), { A => 1, B => 2, C => 42 }, "Stream OK");
ok ($csv->parse ("1,2,42"), "Parse");
is_deeply ([ $csv->fields ], [ 1, 2, 42 ], "Parse OK");
is ($csv->parse ("2,42"), 0, "Parse not enough");
my @err = $csv->error_diag; # error-code, str, pos, rec, fld
is ($err[0], 2014, "Error 2014");
is ($err[4], 2, "Just got 2");
}
{ ok (my $csv = Text::CSV_XS->new ({ strict => 1 }), "Issue#58 no data first");
ok ($csv->column_names (qw( A B C )), "Expect 3 colums");
is ($csv->parse ("2,42"), 0, "Parse not enough");
my @err = $csv->error_diag; # error-code, str, pos, rec, fld
is ($err[0], 2014, "Error 2014");
is ($err[4], 2, "Just got 2");
}
{ ok (my $csv = Text::CSV_XS->new ({ strict => 1 }), "Issue#62 no data first");
my $tf = "issue-62-$$.csv";
END { -e $tf and unlink $tf }
open my $fh, ">", $tf;
print $fh "A,B\n1,2\n";
close $fh;
open $fh, "<", $tf;
ok (my @col = @{$csv->getline ($fh)}, "Get header");
my $val = {};
ok ($csv->bind_columns (\@{$val}{@col}), "Bind columns");
ok ($csv->getline ($fh), "Values into bound hash entries");
my @err = $csv->error_diag; # error-code, str, pos, rec, fld
is ($err[0], 0, "No error 2014");
is_deeply ($val, { A => 1, B => 2 }, "Content");
close $fh;
unlink $tf;
}
__END__
1,2,42
( run in 1.397 second using v1.01-cache-2.11-cpan-5511b514fd6 )