我想计算 CSV 文件的一行中的列数。
第 1 行 10 列
第 2 行 11 列 以此类推
我可以打印出最后一列的值,但我真的只想要每行的计数。
perl -F, -lane "{print @keys[$_].$F[$_] foreach(-1)}" < testing.csv
我在 Windows 机器上
谢谢。
如果您有一个正确的 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->getline 可能会在损坏的行上阻塞(while
循环结束),在这种情况下使用普通解析可能更安全:
perl -MText::CSV -nlwe"
BEGIN { $r = Text::CSV->new() };
$r->parse($_);
print scalar $r->fields
" comma.csv
请注意,在这种情况下,我们使用不同的输入法。这是因为虽然getline()
需要文件句柄,parse()
但不需要。由于菱形运算符根据您的论点使用 ARGV 或 STDIN,我发现最好是明确的。
如果您没有逗号作为字段的一部分,则可以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