Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在满足条件时将多个值相加?_Perl_Csv_Aggregate - Fatal编程技术网

Perl 在满足条件时将多个值相加?

Perl 在满足条件时将多个值相加?,perl,csv,aggregate,Perl,Csv,Aggregate,今天我的脑子好像少了几个螺丝。我对一个问题感到困惑,但公平地说,我对Perl脚本还不熟悉 我正在打开一个csv文件,需要在一列中查找重复值,如果此列中存在重复值,我需要将另一列中的所有值添加到一起,并将其打印到新文件的新行中 open(my $feed, '<', $rawFile) or die "Could not locate '$rawFile'\n"; open(OUTPUT, '>', $newFile) or die "Could not locate '$newFil

今天我的脑子好像少了几个螺丝。我对一个问题感到困惑,但公平地说,我对Perl脚本还不熟悉

我正在打开一个csv文件,需要在一列中查找重复值,如果此列中存在重复值,我需要将另一列中的所有值添加到一起,并将其打印到新文件的新行中

open(my $feed, '<', $rawFile) or die "Could not locate '$rawFile'\n";
open(OUTPUT, '>', $newFile) or die "Could not locate '$newFile'\n";
while(my $line = <$feed>) {
    chomp $line;

    my @columns = split /,/, $line;
    $Address= $columns[1];
    $forSale= $columns[3];

}
open(my$feed)、、$newFile)或die“找不到“$newFile”\n;
while(我的$line=){
chomp$行;
my@columns=split/,/,$line;
$Address=$columns[1];
$forSale=$columns[3];
}

我知道如何打开文件并逐行阅读。我知道如何将结果打印到新文件。我遇到的问题是建立逻辑,即“对于本摘录中的每个重复地址,添加所有forSale值,并在新文件中使用添加的forSale值打印地址。我希望这是有意义的。鼓励提供任何帮助。

此工作所需的工具是一个

这将允许您按地址“键入”内容:

my %sum_of;

while(my $line = <$feed>) {
    chomp $line;

    my @columns = split /,/, $line;
    $Address= $columns[1];
    $forSale= $columns[3];

    $sum_of{$Address} += $forSale; 

}

foreach my $address ( sort keys %sum_of ) {
    print "$address => $sum_of{$address}\n";
}
my%sum\u;
while(我的$line=){
chomp$行;
my@columns=split/,/,$line;
$Address=$columns[1];
$forSale=$columns[3];
{$Address}+=$forSale的$sum_;
}
foreach my$地址(排序键%sum of){
打印“$address=>{$address}\n的$sum_”;
}

此作业所需的工具是一个

这将允许您按地址“键入”内容:

my %sum_of;

while(my $line = <$feed>) {
    chomp $line;

    my @columns = split /,/, $line;
    $Address= $columns[1];
    $forSale= $columns[3];

    $sum_of{$Address} += $forSale; 

}

foreach my $address ( sort keys %sum_of ) {
    print "$address => $sum_of{$address}\n";
}
my%sum\u;
while(我的$line=){
chomp$行;
my@columns=split/,/,$line;
$Address=$columns[1];
$forSale=$columns[3];
{$Address}+=$forSale的$sum_;
}
foreach my$地址(排序键%sum of){
打印“$address=>{$address}\n的$sum_”;
}
您好

我想在提供给您的完美答案上添加一些小的修改

您可以按原来的方式打开一个文件,也可以在命令行上打开多个文件,例如
test.pl sample1.csv sample2.csv
,您可以在此处阅读

我还将选择检查文件是否包含逗号字符(,),否则在终端上打印该行无法解析

在分割数组中的所有值之后,下一步我将修剪字符串的前导和尾随空格

说到这里,请看下面的解决方案:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %hash;
while (<>) {
    chomp;
    if (index($_, ',') != -1) {
    my @fields = split(/,/);
    # remove leading and trailing white space
    s{^\s+|\s+$}{}g foreach @fields;
    $hash{$fields[0]} += $fields[3];
    }
    else {
    warn "Line could not be parsed: $_\n";
    }
} continue {
    close ARGV if eof;
}
print Dumper \%hash;

__END__

$ perl test.pl sample.csv
$VAR1 = {
          '123 6th St.' => 3,
          '71 Pilgrim Avenue' => 5
        };

__DATA__

123 6th St., Melbourne, FL 32904, 2
71 Pilgrim Avenue, Chevy Chase, MD 20815, 5
123 6th St., Melbourne, CT 06074, 1
!/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的%hash;
而(){
咀嚼;
如果(索引($)!=-1){
我的@fields=split(/,/);
#删除前导和尾随空格
s{^\s+|\s+$}{}g foreach@fields;
$hash{$fields[0]}+=$fields[3];
}
否则{
警告“无法分析行:$\n”;
}
}继续{
如果eof关闭ARGV;
}
打印转储程序\%hash;
__结束__
$perl test.pl sample.csv
$VAR1={
第六街123号=>3号,
“朝圣大道71号”=>5
};
__资料__
佛罗里达州墨尔本第6街123号,邮编32904,邮编2
马里兰州雪佛兰蔡斯朝圣大道71号,邮编:20815,5
加利福尼亚州墨尔本第6街123号,邮编06074
由于您没有向我们提供输入数据的样本,我创建了自己的

另一种可能的方法是按照建议使用模块。具有我前面提到的相同检查的代码示例,请参见下面的内容:

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
use Data::Dumper;

my $csv = Text::CSV->new({ sep_char => ',' });

my %hash;
while (<>) {
    chomp;
    if ($csv->parse($_)) {
    my @fields = $csv->fields();
    # remove leading and trailing white space
    s{^\s+|\s+$}{}g foreach @fields;
    $hash{$fields[0]} += $fields[3];
    } else {
    warn "Line could not be parsed: $_\n";
    }
} continue {
    close ARGV if eof;
}
print Dumper \%hash;

__END__

$ perl test.pl sample.csv
$VAR1 = {
          '123 6th St.' => 3,
          '71 Pilgrim Avenue' => 5
        };

__DATA__

123 6th St., Melbourne, FL 32904, 2
71 Pilgrim Avenue, Chevy Chase, MD 20815, 5
123 6th St., Melbourne, CT 06074, 1
!/usr/bin/perl
严格使用;
使用警告;
使用Text::CSV;
使用数据::转储程序;
我的$csv=Text::csv->new({sep_char=>','});
我的%hash;
而(){
咀嚼;
如果($csv->parse($u2;)){
我的@fields=$csv->fields();
#删除前导和尾随空格
s{^\s+|\s+$}{}g foreach@fields;
$hash{$fields[0]}+=$fields[3];
}否则{
警告“无法分析行:$\n”;
}
}继续{
如果eof关闭ARGV;
}
打印转储程序\%hash;
__结束__
$perl test.pl sample.csv
$VAR1={
第六街123号=>3号,
“朝圣大道71号”=>5
};
__资料__
佛罗里达州墨尔本第6街123号,邮编32904,邮编2
马里兰州雪佛兰蔡斯朝圣大道71号,邮编:20815,5
加利福尼亚州墨尔本第6街123号,邮编06074
希望这有帮助

BR/Thanos

你好

我想在提供给您的完美答案上添加一些小的修改

您可以按原来的方式打开一个文件,也可以在命令行上打开多个文件,例如
test.pl sample1.csv sample2.csv
,您可以在此处阅读

我还将选择检查文件是否包含逗号字符(,),否则在终端上打印该行无法解析

在分割数组中的所有值之后,下一步我将修剪字符串的前导和尾随空格

说到这里,请看下面的解决方案:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %hash;
while (<>) {
    chomp;
    if (index($_, ',') != -1) {
    my @fields = split(/,/);
    # remove leading and trailing white space
    s{^\s+|\s+$}{}g foreach @fields;
    $hash{$fields[0]} += $fields[3];
    }
    else {
    warn "Line could not be parsed: $_\n";
    }
} continue {
    close ARGV if eof;
}
print Dumper \%hash;

__END__

$ perl test.pl sample.csv
$VAR1 = {
          '123 6th St.' => 3,
          '71 Pilgrim Avenue' => 5
        };

__DATA__

123 6th St., Melbourne, FL 32904, 2
71 Pilgrim Avenue, Chevy Chase, MD 20815, 5
123 6th St., Melbourne, CT 06074, 1
!/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的%hash;
而(){
咀嚼;
如果(索引($)!=-1){
我的@fields=split(/,/);
#删除前导和尾随空格
s{^\s+|\s+$}{}g foreach@fields;
$hash{$fields[0]}+=$fields[3];
}
否则{
警告“无法分析行:$\n”;
}
}继续{
如果eof关闭ARGV;
}
打印转储程序\%hash;
__结束__
$perl test.pl sample.csv
$VAR1={
第六街123号=>3号,
“朝圣大道71号”=>5
};
__资料__
佛罗里达州墨尔本第6街123号,邮编32904,邮编2
马里兰州雪佛兰蔡斯朝圣大道71号,邮编:20815,5
加利福尼亚州墨尔本第6街123号,邮编06074
由于您没有向我们提供输入数据的样本,我创建了自己的

另一种可能的方法是按照建议使用模块。具有我前面提到的相同检查的代码示例,请参见下面的内容:

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
use Data::Dumper;

my $csv = Text::CSV->new({ sep_char => ',' });

my %hash;
while (<>) {
    chomp;
    if ($csv->parse($_)) {
    my @fields = $csv->fields();
    # remove leading and trailing white space
    s{^\s+|\s+$}{}g foreach @fields;
    $hash{$fields[0]} += $fields[3];
    } else {
    warn "Line could not be parsed: $_\n";
    }
} continue {
    close ARGV if eof;
}
print Dumper \%hash;

__END__

$ perl test.pl sample.csv
$VAR1 = {
          '123 6th St.' => 3,
          '71 Pilgrim Avenue' => 5
        };

__DATA__

123 6th St., Melbourne, FL 32904, 2
71 Pilgrim Avenue, Chevy Chase, MD 20815, 5
123 6th St., Melbourne, CT 06074, 1
!/usr/bin/perl
严格使用;
使用警告;
使用Text::CSV;
使用数据::转储程序;
我的$csv=Text::csv->new({sep_char=>','});
我的%hash;
而(){
咀嚼;
如果($csv->parse($u2;)){
我的@fields=$csv->fields();
#删除前导和尾随空格
s{^\s+|\s+$}{}g foreach@fields;
$hash{$fields[0]}+=$fields[3];
}否则{
警告“无法分析行:$\n”;
}
}继续{
如果eof关闭ARGV;
}
打印转储程序\%hash;
__结束__
$perl test.pl sample.csv
$VAR1={