Perl 在满足条件时将多个值相加?
今天我的脑子好像少了几个螺丝。我对一个问题感到困惑,但公平地说,我对Perl脚本还不熟悉 我正在打开一个csv文件,需要在一列中查找重复值,如果此列中存在重复值,我需要将另一列中的所有值添加到一起,并将其打印到新文件的新行中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
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={