0

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

第 1 行 10 列
第 2 行 11 列 以此类推

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

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

我在 Windows 机器上

谢谢。

4

2 回答 2

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->getline 可能会在损坏的行上阻塞(while循环结束),在这种情况下使用普通解析可能更安全:

perl -MText::CSV -nlwe"
    BEGIN { $r = Text::CSV->new() }; 
    $r->parse($_); 
    print scalar $r->fields
" comma.csv

请注意,在这种情况下,我们使用不同的输入法。这是因为虽然getline()需要文件句柄,parse()但不需要。由于菱形运算符根据您的论点使用 ARGV 或 STDIN,我发现最好是明确的。

于 2013-01-31T19:20:04.903 回答
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
于 2013-01-31T19:02:17.487 回答