逐个细胞解析CSV

时间:2012-10-26 14:33:02

标签: perl parsing csv

我有一个包含大量列和行的CSV文件,但我需要对某些列的单元格求和:

Samples | Name | Value1 | Value2 | Value3

A-Sample | A-Name | 1 | 32 | 27 | 21

B-Sample | B-Name | 2 | 23 | 12 | 13

C-Sample | C-Name | 3 | 10 | 98 | 59

D-Sample | D-Name | 4 | 21 | 78 | 72

E-Sample | E-Name | 5 | 32 | 72 | 27

我需要列Value 1中的单元格总和,列Value2中的单元格总和。我正在尝试使用Text :: CSV,但我只将结果作为行。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

尝试Spreadsheet :: Read,也许它符合您的需求。使用此模块,您可以像任何其他电子表格一样使用csv。有关更多信息,请参阅perldoc Spreadsheet :: Read或https://metacpan.org/module/Spreadsheet::Read

#! /usr/bin/env perl
use Modern::Perl '2012';

use Spreadsheet::Read;
use Data::Dumper;

my $spreadsheet = my $ref = ReadData ("test.csv", sep => "|"); 
my @rows = Spreadsheet::Read::rows ($spreadsheet->[1]);
my @values = map {$_->[4] } @rows; # columns starting with 0
say Dumper (\@values);

<强>输出

$VAR1 = [
      'Value3',
      '27',
      '12',
      '98',
      '78',
      '72'
    ];

答案 1 :(得分:0)

我最喜欢的这类东西是Tie :: Array :: CSV

use Tie::Array::CSV;
tie my @csv, 'Tie::Array::CSV', 'filename.csv' or die;
my @answer;         # store the results
for (my $row = 1; $row < @csv; $row++) # each row if the csv
{
    next unless $row->[2] =~ /^\s*\d+\s*$/; # Not rows where 3rd field isn't numeric
    for (my $i = 2; $i < @$row; $i++)  # cols 2 onwards
    {
        $answer[$i] += $row->[$i];  # sum the results
    }
 }
 say "@answer[2 .. $#answer]"; # display the sums

答案 2 :(得分:0)

我使用了很多CSV文件,到目前为止我最喜欢的模块是Tie::Handle::CSVDBD::CSV

perlmeme.org在解析CSV文件方面有一个很棒的tutorial