App-Bin4TSV
view release on metacpan or search on metacpan
scripts/csv2tsv view on Meta::CPAN
$o{'@'} //= 5 ; # ä½ãå
¥åãç¡ãå ´åã«ï¼ä½ç§ããã«è¦åãåºãã
my $alarmF = 0 ; # è¦åãåºããåºããªããã
& alarmset ; # å
¥åã ä¸å®ç§æ°ä»¥å
ã«å§ã¾ããªãå ´åã«ãç»é¢ã«æ³¨æã表示ããã
& rev and exit 0 if $o{'~'} ;
& main and exit 0 ;
# å
¥åãç¡ãã¨ãã«ï¼æ³¨æã表示ããä»çµã¿
sub alarmset {
# return unless -t ;
# $alarmF = 1 ;
# $SIG{ALRM} = sub {
# print STDERR GREEN "[$Script] Waiting CSV-formatted input from STDIN..\n" ;
# $SIG{ALRM} = sub { print STDERR GREEN "." ; alarm $o{'@'} } ;
# alarm $o{'@'} ;
#} ;
$SIG{ALRM} = sub { print STDERR GREEN BOLD FAINT "$. lines have read. " ; alarm $o{'@'} } ;
alarm $o{'@'} ;
}
# éæä½ã TSV -> CSV
sub rev ( ) {
grep { $_ = quotemeta $_ if defined $_ } $o{e} , $o{n} , $o{t} ;
my $csv = Text::CSV_XS->new( { binary => 1 , sep_char => $o{s} , always_quote => $o{a} } ) ; # if binary =0 then UTF-8 character cause trouble
while ( <> ){
# do { $alarmF = 0 ; alarm 0 } if $alarmF ;
chomp ;
s/\r$// ;
my @F = split /\t/, $_ , -1 ;
for ( @F ){
& escrev ($o{t} , "\t") if defined $o{t} && $o{t} ne '' ; # ã¨ã¹ã±ã¼ããããæåãèæ
®ãã¤ã¤ã-t ãã ã¿ãæåã復å
ããã
& escrev ($o{n} , "\n") if defined $o{n} && $o{n} ne '' ; # ã¨ã¹ã±ã¼ããããæåãèæ
®ãã¤ã¤ã-n ãã æ¹è¡æåã復å
ããã
}
my $status = $csv -> print ( * STDOUT, [ @F ] ) ;
print STDERR BRIGHT_RED "Something wrong at line $.\n" unless $status ;
print "\n" ;
}
print STDERR CYAN qq[[$Script -~] "$ARGV": $. lines input has processed.\n] unless $o{Q} ;
return 1 ;
sub escrev {
my $bef = $_[0] ;
my $aft = $_[1] ;
s/(?<!$o{e})$bef/$aft/g ; # å¦å®çå¾èªã¿ã¯ (?<!pattern)ã; è¯å®çå¾èªã¿ã¯ (?<=pattern)
s/$o{e}$bef/$bef/g ; #print STDERR BLUE "$o{e}, $o{n}\n" ;
}
}
sub main ( ) {
binmode * STDOUT , ":utf8" ; # Necessry because Text::CSV_XS decodes UTF8 input.
binmode * STDERR , ":utf8" ; # Necessry because Text::CSV_XS decodes UTF8 input.
my $linepos = 1 ; # CSV ã§èªã¿è¾¼ãã§ããã®ã§ã$. ã¯2以ä¸å¢ãããã¨ããããèªã¿åã度ã«ã $linepos ãã $. è¡ç®ã¾ã§ã¨èªèããããã
my %cols ; # ä½åã®åãä½è¡ãæã£ã¦ãããã表ãã3åã®è¡ã120è¡åå¨ããããªã©ã表ãã
our $csv = Text::CSV_XS -> new ( { binary => 1 , sep_char => $o{s} , auto_diag => 1 } ) ; # if binary => 0 then when "\n" is included in a cell it cause trouble.
push my @trans , grep {$_} do { [ "\t" , $o{t} ] if defined $o{t} } , do { [ "\n" , $o{n} ] if defined $o{n} } ; # æååç½®æã®æå®ã
my @warnstr ; # è¦åå¯¾è±¡ã®æååãæ¹è¡ãã¿ãæåãªã©
my @escape ; # ã¨ã¹ã±ã¼ãå¯¾è±¡ã®æåå
unless ($o{Q}) {
push @warnstr , $o{t} if defined $o{t} ;
push @warnstr , $o{n} if defined $o{n} ;
@warnstr = grep { $_ ne '' } @warnstr ;
@escape = map { quotemeta $_ } @warnstr ; # ãã®æç¹ã§ -vã®ãã®ã¯ã¯ãã£ã¦ããªã
push @warnstr , "\t" if $o{v} || ! defined $o{t} ;
push @warnstr , "\n" if $o{v} || ! defined $o{n} ;
}
# å
¥åãèªåããå¦çãã¦åºåã
my $posV = 0 ; # åºåä¸ã®ç¸¦æ¹åã®ä½ç½®ã表ã
while ( my $x = $csv -> getline( *ARGV ) ) { # 次è¡ä»¥ä¸ãèªããã¨â
# *ARGVã¯Old(er) support 㨠perldoc Text::CSV_XSã«è¨è¼ãããå°æ¥ãµãã¼ããããªãããã
# geline ã§ããã¨ã©ã¼ãèµ·ããããªãã ? <--- - -
do { $alarmF = 0 ; alarm 0 } if $alarmF ;
$posV ++ ;
$cols{ @$x } ++ ; # ãã®è¡ã¯ãåãä½åæã£ã¦ãããã®æ°ããï¼å¾ã§ï¼ä½åã®è¡ãä½åã®åãæã£ã¦ãããæ
å ±è¡¨ç¤ºãããããã«ããã
my $posH = 0 ; # åºåä¸ã®ã»ã«ã®æ°´å¹³ä½ç½®ã表ãã
for my $cell ( @$x ) {
$posH ++ ;
warnprint ( $cell , \@warnstr, [ $linepos , $posV , $posH ] ) unless $o{Q} ; # è¦æ³¨ææååã«å¯¾ãã¦ãè¦åã表示ããã
$cell =~ s/(?=$_)/$o{e}/g for @escape ; # ã¨ã¹ã±ã¼ããã /
$cell =~ s/$trans[$_]->[0]/$trans[$_]->[1]/g for 0 .. $#trans ; # -tã¨-nã®å¦çãå ããã
}
# åºåå¦ç
print join ( "\t", @$x ) . "\n" ;
print "\n" if $o{2} ; # # åºååè¡ã®éã«ç©ºè¡ãæ¿å
¥ããå ´åã®å¦ç
$linepos = $. + 1 ; # <- å
¥åã®ä½è¡ç®ãæ¹è¡åºåãã§æ°ãã $. ã« +1 ãã¦ãããtricky!
}
$csv->eof; # <-- - å¿
è¦ã?
& info ( $. , \%cols ) unless $o{Q} ;
return 1 ;
sub info {
my $out1 = qq[[$Script] "$ARGV": $_[0] lines] ;
my $out2 = keys %{ $_[1] } ? "=> columns x rows: " . join " + " , map { "${_} x ${$_[1]}{$_}"} sort {$a<=>$b} keys %{ $_[1] } : '' ;
print STDERR CYAN qq[$out1 $out2 \n] ;
}
sub warnprint {
my $cell = $_[0] ;
my ( $linepos , $posV , $posH ) = @{ $_[2] } ;
for my $seek ( @{ $_[1] } ) {
next unless $cell =~ m/\Q$seek\E/ ;
my $S = do { local $_ = $seek ; s/\n/\\n/g ; s/\t/\\t/g ; $_ } ; #quotemeta $seek ;
my $L = ($linepos == $.) ? $linepos : "$linepos-$." ;
my $C = do { local $_ = $cell ; s/\n/\e[44m\\n\e[40m/gs ; s/\t/\e[44m\\t\e[40m/gs ; "\e[0m\e[4m$_" } ; # èæ¯ãéãããã
my $sout = qq[[$Script] Warning: "$S" detected at "$ARGV": input line $L; output cell (Row: $posV, Col: $posH): ${C}\n] ;
print STDERR BRIGHT_RED $sout ;
}
}
# ã¨ã©ã¼å¦ç (Text::CSV_XS ã®ã¨ã©ã¼å¦ç) , ãã®ããã°ã©ã ã®å¤æ°ã®ä½¿ãæ¹ãçç±ã§ããã®ä½ç½®ã«ENDãç½®ããã
END {
#exit if $o{'~'} ;
exit if ! defined $csv ;
my @tmp = $csv -> error_diag () ; # ($cde, $str, $pos, $rec, $fld) = $csv->error_diag ();
if ( $tmp[0] != 2012 ) { # perldoc Text::CSV_XS ã§ 2012Â ãåç
§ãEOFãæå³ããã
print STDERR BRIGHT_RED join (":",@tmp),"\n" ;
print STDERR ON_BRIGHT_RED BLACK "_ERROR_INPUT at line $.: " ;
#use Data::Dumper ; #print STDERR UNDERLINE Dumper $csv ;
print STDERR UNDERLINE BRIGHT_RED $csv ->{_ERROR_INPUT} ;
exit 1 ;
}
}
}
## ãã«ãã¨ãã¼ã¸ã§ã³æ
å ±
BEGIN {
our $VERSION = 0.56 ;
$Getopt::Std::STANDARD_HELP_VERSION = 1 ;
grep { m/--help/} @ARGV and *VERSION_MESSAGE = sub {} ;
# æå㯠0.21 ãç®å®ã¨ããã
# 1.00 以ä¸ã¨ããå¿
è¦æ¡ä»¶ã¯è±èªçã®ãã«ãããã¡ãã¨åºããã¨ã
# 2.00 以ä¸ã¨ããå¿
è¦æ¡ä»¶ã¯ãã¹ãã³ã¼ããå«ããã¨ã
# 0.51 : è±æããã¥ã¢ã«ãPODå½¢å¼ã«ããã
# 0.52 : revã®æ©è½ãããã°
# 0.53 : ã¨ã¹ã±ã¼ãæåãä½åã«ç¾ãããã°ãè¨æ£ãæ´ã«ãªãã¡ã¯ã¿ãæ´ã«ã·ã§ãã³ã°ã«-Tãå ããã
# 0.54 : revã§2次æ
å ±ãåºãããã«ãããSTDERRã§éASCIIã«å¯¾å¿ã
# 0.55 : CSVã®ãã£ã¼ã«ãã®åºåæåã夿´å¯è½ã¨ãããText::CSV_XSã§ã¨ã©ã¼ãèµ·ããã¨ãã«ãå
¥åè¡ã®å
容ã表示ããããã«ãããããã« -Tã-tã«ãã(perldocãèµ·åã§ããªãã£ããã)ã
# 0.56 : ããã¥ã¢ã«ã®è±èªã®é¨åã2ç®æè¨æ£ã
}
sub HELP_MESSAGE {
( run in 0.824 second using v1.01-cache-2.11-cpan-39bf76dae61 )