230215 01/16/2000 57533 "" 0 1045403 "" ? 0 0 217623
230215 01/18/2000 77659 "" 0 1045403 "" ? 0 0 217624
230215 01/25/2000 76583 "" 0 1045403 "" ? 0 0 217625
230215 01/29/2000 58082 "" 0 1045403 "" ? 0 0 217626
230216 01/14/2000 50020 "" 0 1045403 "" ? 0 0 217627
230216 01/18/2000 66444 "" 0 1045403 "" ? 0 0 217628
230216 01/19/2000 51330 "" 0 1045403 "" ? 0 0 217629
所有字段都用空格分隔,我需要将其存储到二维数组中。实际上有500万行像这样。例如,我想将它存储到像$ arr [7] [11]这样的数组中,因为每行有7行和11个值。
答案 0 :(得分:7)
要学习,你必须这样做。要做,你必须偶尔尝试失败,以便在鱼市关闭时你可以吃。
关于问题,而不是人们提出问题,所以这里是一个答案,没有任何解释,鼓励你查看正在发生的事情。
#!/usr/bin/env perl
use warnings; use strict;
my @data;
while (<DATA>) {
next unless /\S/;
push @data, [ split ];
}
__DATA__
230215 01/16/2000 57533 "" 0 1045403 "" ? 0 0 217623
230215 01/18/2000 77659 "" 0 1045403 "" ? 0 0 217624
230215 01/25/2000 76583 "" 0 1045403 "" ? 0 0 217625
230215 01/29/2000 58082 "" 0 1045403 "" ? 0 0 217626
230216 01/14/2000 50020 "" 0 1045403 "" ? 0 0 217627
230216 01/18/2000 66444 "" 0 1045403 "" ? 0 0 217628
230216 01/19/2000 51330 "" 0 1045403 "" ? 0 0 217629
答案 1 :(得分:5)
我相信你遇到的问题是Perl数组只能是单个数据的数组。您可以在数组中包含每一行,但是您不希望存储单个数据,而是希望存储11个数据。
幸运的是,Perl允许您将引用存储为数组中的一段数据。 引用可以指向...说...另一个数组。看看Perl Reference Tutorial,这应该有助于您了解如何做到这一点。
这确实是一个相当简单的问题。首先,让我们创建一个循环来读取每一行,并将每一行放入一个名为@file_array
的数组中。
use strict;
use warnings;
use autodie; #So I dont have to worry about my file
open (my $fh, "<", "dataFile.txt");
my @file_array;
while (my $line = <$fh>) {
chomp $line;
push (@file_array, $line);
}
现在,让我们创建一个程序,它接受每一行,并将其拆分为一个数组:
use strict;
use warnings;
use autodie; #So I dont have to worry about my file
open (my $fh, "<", "dataFile.txt");
my @file_array;
while (my $line = <$fh>) {
chomp $line;
my @line_array = split (/\s+/, $line);
}
这两个程序只有一行不同。第一个将文件拆分为一个数组,第二个读取每一行并将其拆分为一个数组。
让我们结合两个程序。而且,不是将$line
放入@file_array
的每个元素中,而是将@line_array
的 *引用放入我@file_array
的每个元素中{1}}:
use strict;
use warnings;
use autodie; #So I dont have to worry about my file
open (my $fh, "<", "dataFile.txt");
my @file_array;
while (my $line = <$fh>) {
chomp $line;
my @line_array = split(/\s+/, $line);
push (@file_array, \@line_array);
}
如果我想谈谈我文件中的第三行,它会被存储为$file_array[2]
中的参考。我可以取消引用$file_array[2] by putting it in
$ {} , and this would get me back my
@ line_array`:
my @line_array = ${$file_array[2]};
现在,如果我想谈谈该行的第四项,我可以说:
my $element = $line_array[3];
但是,我也可以将这两个操作组合成一行。下面,我解除引用存储在$file_array[2]
中的数组并同时取第四个元素(元素#3):
my $element = ${$file_array[2]}[3];
不清楚?幸运的是,Perl有一个->
运算符,允许您在不使用${}
语法的情况下取消引用数组。这样更容易阅读:
my $element = $file_array[2]->[3];
在现代Perl程序中你会看到很多。这就是我谈论我的数组数组的方式。实际上,Perl甚至允许您在数组数组中完全删除数组之间的箭头操作符。你可以这样谈论这个元素:
my $element = $file_array[2][3];
答案 2 :(得分:1)
提示:
while(<FH>)
{
}#iterate line by line through the file pointed by FH
@result = split(m/\s+/, $subject); #store each column to array
因此,只需创建一个对数组的引用数组即可。
其余的我留给你。