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

use*_*629 -4 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
Run Code Online (Sandbox Code Playgroud)

所有字段都用空格分隔,我需要将它存储到二维数组中.实际上有500万行像这样.例如,我想将它存储到像$ arr [7] [11]这样的数组中,因为每行有7行和11个值.

Sin*_*nür 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
Run Code Online (Sandbox Code Playgroud)


Dav*_* W. 5

我相信你遇到的问题是Perl数组只能是单个数据的数组.您可以在数组中包含每一行,但是您不希望存储单个数据,而是希望存储11个数据.

幸运的是,Perl允许您将引用存储为数组中的一段数据.该引用可以指向...说...另一个数组.看看Perl参考教程,这应该有助于您了解如何做到这一点.

这真的是一个相当简单的问题.首先,让我们创建一个循环来读取每一行并将每一行放入一个名为的数组中@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);
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们创建一个程序,接受每一行,并将其拆分为一个数组:

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);
}
Run Code Online (Sandbox Code Playgroud)

这两个程序只有一行不同.第一个将文件拆分为一个数组,第二个读取每一行并将其拆分为一个数组.

让我们结合两个程序.并且,而不是把$line到我的每一个元素@file_array,我要来把*基准@line_array到我的每一个元素@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;
    my @line_array = split(/\s+/, $line);
    push (@file_array, \@line_array);
}
Run Code Online (Sandbox Code Playgroud)

如果我想谈谈我文件中的第三行,它将作为参考存储在$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]};
Run Code Online (Sandbox Code Playgroud)

现在,如果我想谈谈该行的第四项,我可以说:

my $element = $line_array[3];
Run Code Online (Sandbox Code Playgroud)

但是,我也可以将这两个操作合并为一行.下面,我解除引用存储的数组$file_array[2]并同时取第四个元素(元素#3):

my $element = ${$file_array[2]}[3];
Run Code Online (Sandbox Code Playgroud)

不清楚?幸运的是,Perl有一个->运算符,允许您在不使用${}语法的情况下取消引用数组.这样更容易阅读:

my $element = $file_array[2]->[3];
Run Code Online (Sandbox Code Playgroud)

在现代Perl程序中你会看到很多.这就是我谈论我的数组数组的方式.实际上,Perl甚至允许您在数组数组中完全删除数组之间的箭头操作符.你可以这样谈论这个元素:

my $element = $file_array[2][3];
Run Code Online (Sandbox Code Playgroud)