如何使用Perl拆分文本文件并将其存储到2d数组中?

时间:2011-11-17 20:41:32

标签: arrays perl text

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个值。

3 个答案:

答案 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

因此,只需创建一个对数组的引用数组即可。

其余的我留给你。