#!perl -w use strict; use Text::CSV_XS; use Text::xSV; use IO::File; use Benchmark qw(:all); my($cols,$data,$rows) = ( ['Name','City','Num'], [], 999 ); for my $num(0..$rows) { push @$data, ["myself\nme","Portland,Oregon",$num]; } print "\nCompare file creation with Text::xSV and Text::CSV_XS\n"; cmpthese( 50, { xSV => sub { create_xSV('test.xSV',$cols,$data) } , CSV => sub { create_CSV('test.CSV',$cols,$data) } } ); create_xSV('test.xSV',$cols,$data,'keep'); create_CSV('test.CSV',$cols,$data,'keep'); print "\nCompare file reading with Text::xSV and Text::CSV_XS\n"; cmpthese( 50, { xSV => sub { read_xSV('test.xSV') } , CSV => sub { read_CSV('test.CSV') } } ); sub create_xSV { my($fname,$cols,$data,$keep) = @_; my $fh = IO::File->new(">$fname") or die $!; my $csv = Text::xSV->new( fh=>$fh, header=>$cols); $csv->print_header(); $csv->print_row(@$_) for @$data; $fh->close; if (!$keep) { unlink $fname or die $!; } } sub create_CSV { my($fname,$cols,$data,$keep) = @_; my $csv = Text::CSV_XS->new({ binary => 1 }); my $fh = IO::File->new(">$fname") or die $!; $csv->print($fh,$cols); $fh->print("\n"); for (@$data){ $csv->print($fh,$_); $fh->print("\n"); } $fh->close; if (!$keep) { unlink $fname or die $!; } } sub read_xSV { my $fname = shift; my $fh = IO::File->new("$fname") or die $!; my $csv = Text::xSV->new( fh=>$fh, header=>$cols); my $count; $csv->read_header(); while ($csv->get_row()) { my @row = $csv->extract(qw(Name City Num)); die 'Bad Read' unless "@row" eq "@{$data->[$count++]}"; } die "Bad number of rows '$count'" unless $count == $rows+1; $fh->close; } sub read_CSV { my $fname = shift; my $fh = IO::File->new("$fname") or die $!; my $csv = Text::CSV_XS->new({binary=>1}); my $header = $csv->getline($fh); my $count=0; while ( my $columns = $csv->getline($fh) ) { last if !defined $columns->[0]; die 'Bad Read' unless "@$columns" eq "@{$data->[$count++]}"; } die "Bad number of rows '$count'" unless $count == $rows+1; $fh->close; } __END__