Как я могу разделить текстовый файл и сохранить его в 2d массив, используя Perl? - PullRequest
0 голосов
/ 18 ноября 2011
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

Все поля разделены пробелами, мне нужно сохранить это в 2d массив. На самом деле таких строк 5 миллионов. Например, я хотел бы сохранить это в массив, как $ arr [7] [11], потому что в каждой строке 7 строк и 11 значений.

Ответы [ 3 ]

7 голосов
/ 18 ноября 2011

Чтобы учиться, нужно делать.Чтобы сделать это, вы должны иногда пытаться потерпеть неудачу, чтобы вы могли есть, когда рыбный рынок закрыт.

Так что речь идет о вопросах, а не о людях, задающих вопросы, поэтому здесь есть ответ, без каких-либо объяснений, чтобы поощритьчтобы посмотреть, что происходит.

#!/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
5 голосов
/ 18 ноября 2011

Я полагаю, что проблема у вас в том, что массивы 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);
}

Теперь давайте создадим программу, которая берет каждую строку и разбивает ее на массив:

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:

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];
1 голос
/ 18 ноября 2011

Подсказки:

while(<FH>)
{
}#iterate line by line through the file pointed by FH

@result = split(m/\s+/, $subject); #store each column to array

Так что просто создайте массив ссылок на массивы, и все готово.

Остальное я оставлю вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...