Perl:读取列并转换为数组
我是perl新手,尝试读取包含列的文件并创建数组。 我有一个以下列的文件Perl:读取列并转换为数组,perl,Perl,我是perl新手,尝试读取包含列的文件并创建数组。 我有一个以下列的文件 file.txt A 15 A 20 A 33 B 20 B 45 C 32 C 78 我想为中存在的每个唯一项创建一个数组,其值从第二列分配。 例如: 尝试了以下代码,仅用于打印2列 use strict; use warnings; my $filename = $ARGV[0]; open(FILE, $filename) or die "Could not open
file.txt
A 15
A 20
A 33
B 20
B 45
C 32
C 78
我想为中存在的每个唯一项创建一个数组,其值从第二列分配。
例如:
尝试了以下代码,仅用于打印2列
use strict;
use warnings;
my $filename = $ARGV[0];
open(FILE, $filename) or die "Could not open file '$filename' $!";
my %seen;
while (<FILE>)
{
chomp;
my $line = $_;
my @elements = split (" ", $line);
my $row_name = join "\t", @elements[0,1];
print $row_name . "\n" if ! $seen{$row_name}++;
}
close FILE;
使用严格;
使用警告;
我的$filename=$ARGV[0];
打开(文件,$filename)或死亡“无法打开文件“$filename”$!”;
我看到的百分比;
而()
{
咀嚼;
我的$line=$\ux;
my@elements=split(“,$line);
我的$row_name=join“\t”,@elements[0,1];
打印$row_name。“\n”if!$seen{$row_name}++;
}
关闭文件;
谢谢将循环更改为类似以下内容:
while (my $line = <FILE>)
{
chomp($line);
my @elements = split (" ", $line);
push(@{$seen{$elements[0]}}, $elements[1]);
}
while(我的$line=)
{
chomp($line);
my@elements=split(“,$line);
push(@{$seen{$elements[0]},$elements[1]);
}
这将创建/追加找到的每个项目的列表,并生成一个散列,其中键是左侧项目,值是右侧项目的列表。然后,您可以根据需要处理或重新分配值。将循环更改为类似以下内容:
while (my $line = <FILE>)
{
chomp($line);
my @elements = split (" ", $line);
push(@{$seen{$elements[0]}}, $elements[1]);
}
while(我的$line=)
{
chomp($line);
my@elements=split(“,$line);
push(@{$seen{$elements[0]},$elements[1]);
}
这将创建/追加找到的每个项目的列表,并生成一个散列,其中键是左侧项目,值是右侧项目的列表。然后,您可以根据需要处理或重新分配值。首先是一些一般的Perl建议。现在,我们喜欢使用词汇变量作为文件句柄,并将三个参数传递给
open()
第二条建议-不要将此数据存储在单个数组中。最好将其存储在更复杂的数据结构中。我建议使用散列,其中键是字母,值是一个数组,包含与该字母匹配的所有数字。这非常容易构建:
use strict;
use warnings;
use feature 'say';
my %data; # I'd give this a better name if I knew what your data was
while (<>) {
chomp;
my ($letter, $number) = split; # splits $_ on whitespace by default
push @{ $data{$letter} }, $number;
}
# Walk the hash to see what we've got
for (sort keys %data) {
say "$_ : @{ $data{$_ } }";
}
使用严格;
使用警告;
使用特征“说”;
我的%data;#如果我知道你的数据是什么,我会给这个起个更好的名字
而(){
咀嚼;
my($letter,$number)=split;#默认情况下在空白处拆分$
按@{$data{$letter}},$number;
}
#随便走走,看看我们有什么
对于(排序键%数据){
说“$\:@{$data{$}”;
}
首先是一些一般的Perl建议。现在,我们喜欢使用词汇变量作为文件句柄,并将三个参数传递给open()
第二条建议-不要将此数据存储在单个数组中。最好将其存储在更复杂的数据结构中。我建议使用散列,其中键是字母,值是一个数组,包含与该字母匹配的所有数字。这非常容易构建:
use strict;
use warnings;
use feature 'say';
my %data; # I'd give this a better name if I knew what your data was
while (<>) {
chomp;
my ($letter, $number) = split; # splits $_ on whitespace by default
push @{ $data{$letter} }, $number;
}
# Walk the hash to see what we've got
for (sort keys %data) {
say "$_ : @{ $data{$_ } }";
}
使用严格;
使用警告;
使用特征“说”;
我的%data;#如果我知道你的数据是什么,我会给这个起个更好的名字
而(){
咀嚼;
my($letter,$number)=split;#默认情况下在空白处拆分$
按@{$data{$letter}},$number;
}
#随便走走,看看我们有什么
对于(排序键%数据){
说“$\:@{$data{$}”;
}
谢谢Nick,我如何存储或打印此散列值以验证它是否只从第1列获取唯一值和从第2列获取相应值。@Danishheikh是典型的方法,它使用引用,因此类似于打印转储程序\%
谢谢Nick,我如何存储或打印此哈希值以验证它是否只从第1列获取唯一值,并从第2列获取相应值。@DanishSheikh是典型的方法,它使用了类似于print Dumper\%的引用代码>在数据中按名称存储数据称为符号引用,以防需要对其进行研究。这是不好的,因为数据中的错误名称可能会破坏Perl变量。使用带有名称的散列作为键要好得多。在数据中按名称存储数据称为符号引用,以防您想要研究它。这是不好的,因为数据中的错误名称可能会破坏Perl变量。使用名为的哈希作为键要好得多。
while (<>) { ... }
use strict;
use warnings;
use feature 'say';
my %data; # I'd give this a better name if I knew what your data was
while (<>) {
chomp;
my ($letter, $number) = split; # splits $_ on whitespace by default
push @{ $data{$letter} }, $number;
}
# Walk the hash to see what we've got
for (sort keys %data) {
say "$_ : @{ $data{$_ } }";
}