45 lines
723 B
Text
45 lines
723 B
Text
|
#!/usr/bin/env perl
|
||
|
|
||
|
use Text::CSV;
|
||
|
use Getopt::Long qw/ GetOptionsFromArray :config pass_through /;
|
||
|
use warnings;
|
||
|
use strict;
|
||
|
|
||
|
my $usage = "usage: $0 [-e] < file.csv\n";
|
||
|
|
||
|
exit main( @ARGV );
|
||
|
|
||
|
|
||
|
sub main
|
||
|
{
|
||
|
my $escape = 0;
|
||
|
|
||
|
GetOptionsFromArray( \@_, 'escape' => \$escape ) or die $usage;
|
||
|
|
||
|
my $csv = Text::CSV->new( { binary => 1 } );
|
||
|
my $in = \*STDIN;
|
||
|
|
||
|
while (my $row = $csv->getline( $in )) {
|
||
|
@$row = map c_escape($_) => @$row if $escape;
|
||
|
print join("\t" => @$row) . $/;
|
||
|
}
|
||
|
|
||
|
$csv->eof or $csv->error_diag();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
sub c_escape
|
||
|
{
|
||
|
my $str = shift;
|
||
|
my %escapes =
|
||
|
(
|
||
|
"\\" => "\\\\",
|
||
|
"\n" => "\\n",
|
||
|
"\t" => "\\t",
|
||
|
);
|
||
|
$str =~ s/([\\\n\t])/ $escapes{$1} /ge;
|
||
|
return $str;
|
||
|
}
|