我想计算CSV文件中一行的列数。
第1行10列 第2行11列 等
我可以打印出最后一列的值,但我真的只想要每行计数。
perl -F, -lane "{print @keys[$_].$F[$_] foreach(-1)}" < testing.csv
我在Windows机器上
感谢。
答案 0 :(得分:4)
如果你有一个合适的csv文件,它可以包含嵌入的分隔符(例如1,"foo,bar",2
),在这种情况下,简单的分割是不够的。您可以非常轻松地使用Text :: CSV模块,如下所示:
复制/粘贴版本:
perl -MText::CSV -lwe"my $c=Text::CSV->new({sep_char=>','}); while($r=$c->getline(*STDIN)) { print scalar @$r }" < sorted.csv
可读版本:
perl -MText::CSV # use Text::CSV module
-lwe # add newline to print, use warnings
"my $c = Text::CSV->new(); # set up csv object
while( $r = $c->getline(*STDIN) ) { # get lines from stdin
print scalar @$r # print row size
}" < sorted.csv # input file to stdin
如果你的输入可能不稳定,Text :: CSV-&gt; getline可能会在损坏的行上阻塞(while
循环结束),在这种情况下使用普通解析可能更安全:
perl -MText::CSV -nlwe"
BEGIN { $r = Text::CSV->new() };
$r->parse($_);
print scalar $r->fields
" comma.csv
请注意,在这种情况下,我们使用不同的输入方法。这是因为虽然getline()
需要文件句柄,但parse()
却没有。由于钻石运营商根据您的论点使用ARGV或STDIN,我发现最好是明确的。
答案 1 :(得分:0)
如果您没有逗号作为字段的一部分,则可以split
该行并计算字段数
#! /usr/bin/perl
use strict;
use warnings;
my @cols = split(',', $_);
my $n = @cols;
print "row $. $n columns\n";
你可以打电话给这个
perl -n script.pl testing.csv