App-Bin4TSV
view release on metacpan or search on metacpan
scripts/crosstable view on Meta::CPAN
#!/Users/toshiyuki-shimono/.plenv/versions/5.32.1/bin/perl5.32.1
use 5.014 ; use strict ; use warnings ;
use Scalar::Util qw/looks_like_number/; # 5.7 ~
use Getopt::Std; getopts '::^:~=+:,:@:0:1:d:i:qvm:' , \my %o ;
use Term::ANSIColor qw/:constants color/; $Term::ANSIColor::AUTORESET = 1 ;# v5.6 ~
#use utf8 ;
my $isep = $o{i} // "\t" ; # å
¥åã®åºåãæå
my $oemp = $o{'0'} // 0 ; # åºåã®ã»ã«ãæªå®ç¾©å¤ã®å ´åã«ä»£ããã«åºåããæåå
my $sec = $o{'@'} // 10 ; # ä½ç§ãã¨ã«å¦çç¶æ
ãåºåãããã
my $addC ; # ããåãå ç®ããå ´åã®åã®æå®
my $t00 ; # 表ã®å·¦ä¸é
ã«è¼ããæåå
my %ax2 ; # ãã¼ã¯æ¨ªè»¸ã®é
ç®åã¨ãªãã
my %C ; # ã»ã«ã®å¤
my %Cc ; # 1ä»¶ã1åã¨æ°ããã
my %Ce ; # 空æååã®åæ°ãæ°ããã
$o{','} //= 3 ; # 使¡ãã¨ã«åºåãã
$o{d} //= 0 ; # åã»ã«ã使¡ã®ã¹ãã¼ã¹ã§å³è©°ã«ãããã
$SIG{ALRM} = sub {
(my $n=$.) =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/g ; # 3æ¡ãã¨ã«åºåãã
print STDERR GREEN "$n lines read. " , scalar localtime , " " , RESET '' ;
alarm $sec
} ;
my $IntFirst = sub {
&{ $SIG{ALRM} } ;
print STDERR BRIGHT_RED
'Do you want to get the halfway result? Then type Ctrl + C again within 2 seconds. '. "\n" .
'Really want to Quit? Then press Ctrl + "\" or Ctrl + Yen-Mark. (Ctrl+Z may be what you want.) ' . RESET "\n" ;
$SIG{INT} = sub { select *STDERR ; & Output ; select *STDOUT ; return } ;
sleep 2 ;
return ;
} ;
$SIG{INT} = $IntFirst ;
& Init ;
& Input ;
& Output ;
exit 0 ;
sub Init {
* CYAN = * GREEN = sub { @_ } if $o{q} ; # -q ã«ããçè²ã³ãã³ããç¡å¹åããã
$addC = $o{'+'} > 0 ? $o{'+'} - 1 : $o{'+'} if $o{'+'} ;
$addC = $o{'^'} > 0 ? $o{'^'} - 1 : $o{'^'} if $o{'^'} ;
}
sub Input {
$t00= $o{'='}? <> : "X1\tX2" ;
chomp $t00; $t00 =~ s{\t}{*}g ;
$t00 = $o{1} if defined $o{1} ; # ) { my $t = quotemeta $o{1} ; $t00 =~ s/.*/$t/ }
#s/.*\t/\Q$o{1}\E/ if defined $o{1} ;
alarm $sec ;
while(<>){
chomp;
my @F = split /$isep/o , $_ , -1 ; #($addC//2)+1 ; #3åç®ä»¥éã¯é£çµããã -x ã¨çµã¿åããã¦ä½¿ãã¨ããããã
my $add = defined $addC ? splice ( @F, $addC , 1 ) : 1 ; # å ç®ããå ´åã®å¦ç
grep { $_ //= 'undef' } @F[0,1] ;
$ax2 { $F[1] } ++ ;
$o{'^'} and $C { $F[0] } { $F[1] } = $add or $C { $F[0] } { $F[1] } += $add || 0 ;
next unless $o{v} ;
$Ce { $F[0] } { $F[1] } ++ if $add eq '' ;
$Cc { $F[0] } { $F[1] } ++ if $o{3} ;
}
}
sub Output {
cellMult ( \%C, $o{m} ) if defined $o{m} ; # -x ã®ãªãã·ã§ã³ã§ãæå®ãããæ°ãããç®ãã¦ãæ´æ°é¨åãåãåºãã
#insComma ( \%C, 3 ) if defined $o{','} ; # -, ã®ãªãã·ã§ã³ãããã°ãæ°å¤ã«3æ¡ãã¨ã«ã³ã³ããæ¿å
¥
# ä¸çªç®ã®ã¯ãã¹è¡¨ã表示
showMat( \%C , $t00 ) ;
#return if !$o{3} ;
# -v ãæå®ãã¦ãããã©ããã§ç°ãªãã¯ãã¹è¡¨ã表示ããã
if ( $o{v} ) {
print "\n" ;
showMat( \%Cc , "items" ) ; # ã«ã¦ã³ã対象ã¨ãªã£ããã¹ã¦ã®è¡æ°
print "\n" ;
showMat( \%Ce , "empties" ) ; # 空æååãããã¤åºç¾ããã
}
$SIG{INT} = $IntFirst
# my %Cv ; for my$i(@a1){for my$j(@a2){$Cv{$i}{$j}=($Cc{$i}{$j}//0)-($Ce{$i}{$j}//0)}}
}
sub StrNumSort ( @ ) {
+( sort { $a cmp $b } grep { ! looks_like_number ($_) } @_ ) ,
( sort { $a <=> $b } grep { looks_like_number ($_) } @_ ) ;
}
sub showMat ( $$ ) {
my ($C,$h11) = @_ ; # ã»ã«, 縦軸, 横軸, åºå表ã®å·¦ä¸ã®æåå
my @a1 = StrNumSort ( keys %{$C} ) ; # 縦軸ã®åé
ç®å
my @a2 = StrNumSort ( keys %ax2 ) ; # 横軸ã®åé
ç®å
if ( defined $o{':'} ) {
@a1 = () ; # ãªã»ãã
open my $FH , '<' , $o{':'} or die ;
while ( <$FH> ){
chomp ;
push @a1 , $_
}
}
if ( ! $o{'~'} ) {
print CYAN "$h11\t" , GREEN join("\t",@a2 ),"\n" ; # åºåã®1è¡ç®
for my $i ( @a1 ) {
print GREEN $i, "\t" ; # åºåã®1åç®
print join ( "\t" , map { sprintf "%$o{d}s", insComma( $C->{$i}{$_}//$oemp , $o{','} ) } @a2 ) , "\n" ;
}
} else {
print CYAN "$h11\t" , GREEN join("\t",@a1 ),"\n" ; # åºåã®1è¡ç®
for my $i ( @a2 ) {
print GREEN $i, "\t" ; # åºåã®1åç®
#print join ( "\t" , map { $C -> { $_ }{ $i } // $oemp } @a1 ) , "\n" ;
print join ( "\t" , map { sprintf "%$o{d}s", insComma ( $C->{$_}{$i}//$oemp , $o{','} ) } @a1 ) , "\n" ;
}
}
}
sub cellMult ( $$ ) {
for my $i ( keys %{ $_[0] } ) {
for my $j ( keys %{ ($_[0]) -> {$i} } ) {
#$_[0]->{$i}{$j} = defined $_[0]->{$i}{$j} ? int ( $_[0]->{$i}{$j} * $_[1] ) . "." : '' ;
$_[0]->{$i}{$j} = int ( $_[0]->{$i}{$j} * $_[1] ) . "." ;
}
}
}
sub insComma ( $$ ) {
return $_[0] if "0" eq ( $o{','} // '' ) ;
(my $tmp = $_[0]) =~ s/(?<=\d)(?=(\d{$_[1]})+($|\D))/,/g ; # 3æ¡ãã¨ã«åºåãã
return $tmp
}
## ãã«ãã®æ±ã
sub VERSION_MESSAGE {print "1.01\n" ;}
sub HELP_MESSAGE {
use FindBin qw[ $Script ] ;
$ARGV[1] //= '' ;
open my $FH , '<' , $0 ;
while(<$FH>){
s/\$0/$Script/g ;
print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
}
close $FH ;
( run in 0.424 second using v1.01-cache-2.11-cpan-39bf76dae61 )