Perl - 计算csv文件中每行的列数

时间:2013-01-31 18:56:08

标签: perl csv

我想计算CSV文件中一行的列数。

第1行10列 第2行11列 等

我可以打印出最后一列的值,但我真的只想要每行计数。

perl -F, -lane "{print @keys[$_].$F[$_] foreach(-1)}" < testing.csv

我在Windows机器上

感谢。

2 个答案:

答案 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