【问题标题】:Parse CSV cell by cell逐个单元格解析 CSV
【发布时间】:2012-10-16 20:05:15
【问题描述】:

我有一个包含很多列和行的 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,但我只得到行的结果。

谁能帮帮我?

【问题讨论】:

  • 你能展示一小部分 Perl 代码来说明你尝试了什么吗?
  • 在 CPAN 上检查模块 Text::CSV。
  • 如果您自己做,请先读入 CSV 文件。对于文件中的每一行,在分隔符 ("|") 上拆分。这为您提供了该行值的数组。根据要求和的列索引,保留数组中这些索引的运行总数。但是为什么要重新发明轮子,按照建议使用 Text::CSV
  • 这个相关的话题可能会对你有所帮助:Perl script (or anything) to total up CSV column

标签: perl parsing csv


【解决方案1】:

试试 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'
    ];

【讨论】:

  • 谢谢,我修改了函数,以便可以浏览所有列。但是现在我陷入了代码的结果中: while () { my @Column = split ("\t", $_); if ($Column[2] =~ m/3/) { print "$Column[3]\n"; }} 我得到了 10 作为答案,而不是 $Column[3] 中的所有字符串。为什么?
  • 嗨,您能提供更多代码并编辑您的问题吗?谢谢!
【解决方案2】:

我最喜欢的模块是 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

【讨论】:

    【解决方案3】:

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

    perlmeme.org 有一个很棒的 tutorial 解析 CSV 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多