#!/usr/bin/perl --
use strict; use warnings;
use Text::CSV;
use autodie qw/ open close /;
Main( @ARGV );
exit( 0 );
sub Main {
return Usage() unless @_ > 2;
my( $outfile, @infiles ) = @_;
my $csv_out = Text::CSV->new( {
always_quote => 1,
binary => 1,
eol => $/,
} ) or die Text::CSV->error_diag();
open $outfile, '>:raw', $outfile; # autodie
$csv_out->print( $outfile, \@infiles ) or die $csv_out->error_diag
+ ;
@infiles = map { open my $fh, '<:raw', $_; $fh } @infiles;
while( not( grep eof, @infiles ) ){
my @lines = map { scalar readline( $_ ) } @infiles;
#~ chomp( @lines );
#~ no warnings 'uninitialized';
#~ s/[\r\n]+$// for @lines;
s/[\r\n]+$// for grep defined, @lines;
$csv_out->print( $outfile, \@lines ) or die $csv_out->error_di
+ag ;
}
undef $csv_out;
close $outfile; # autodie
} ## end sub Main
sub Usage {
print <<"__USAGE__";
$0
$0 outFile.csv inOne.csv inTwo.csv inThree.csv ...
EXAMPLE SESSION
\$ perl csv.paste.pl out.csv ta.csv tb.csv tc.csv td.csv
\$ cat out.csv
"ta.csv","tb.csv","tc.csv","td.csv"
"a1","b1","c1","d1""st(i)n,ker"""
"a2","b2","c2","d2'st(i)n,ker'"
"a3","b3","c3","d3""'st(i)n,ker'"""
,,,"d4 stinker unquoted "
__USAGE__
} ## end sub Usage
|