File-Raw-Separated

 view release on metacpan or  search on metacpan

t/30-stream-basic.t  view on Meta::CPAN

use strict;
use warnings;
use Test::More;
use File::Raw::Separated qw(import);
use File::Temp qw(tempfile);

# Generate a moderate fixture
my ($fh, $path) = tempfile(SUFFIX => '.csv', UNLINK => 1);
for my $i (1 .. 100) {
    print $fh "row$i,col2_$i,col3_$i\n";
}
close $fh;

# Stream and collect rows
my @rows;
file_csv_parse_stream($path, sub {
    push @rows, [@{$_[0]}];   # explicit copy (AV is reused)
});

is(scalar(@rows), 100, 'streamed 100 rows');
is_deeply($rows[0],  ['row1',   'col2_1',   'col3_1'],   'first row content');
is_deeply($rows[49], ['row50',  'col2_50',  'col3_50'],  'middle row content');
is_deeply($rows[99], ['row100', 'col2_100', 'col3_100'], 'last row content');

# Quoted CSV streaming
my ($fh2, $path2) = tempfile(SUFFIX => '.csv', UNLINK => 1);
print $fh2 qq("a,b","c""d"\n);
print $fh2 qq("line1\nline2",x\n);
close $fh2;

my @qrows;
file_csv_parse_stream($path2, sub { push @qrows, [@{$_[0]}] });
is_deeply(\@qrows, [
    ['a,b', 'c"d'],
    ["line1\nline2", 'x'],
], 'quoted + multiline streaming preserved');

done_testing;



( run in 0.668 second using v1.01-cache-2.11-cpan-140bd7fdf52 )