Прочитайте файл CSV и сохраните в массиве 2 d - PullRequest
4 голосов
/ 26 октября 2011

Я пытаюсь прочитать огромный CSV-файл в 2-мерном массиве, должен быть лучший способ разбить строку и сохранить ее в 2-мерном массиве за один шаг: s Приветствия

my $j = 0;
while (<IN>) 
{

    chomp ;
    my @cols=();
    @cols   = split(/,/); 
    shift(@cols) ; #to remove the first number which is a line header
    for(my $i=0; $i<11; $i++) 
    {
       $array[$i][$j]  = $cols[$i];
    }        
    $j++;    
}

Ответы [ 3 ]

12 голосов
/ 26 октября 2011

CSV не тривиально. Не разбирайся сам. Используйте модуль типа Text :: CSV , который сделает это правильно и быстро.

use strict;
use warnings;

use Text::CSV;

my @data;   # 2D array for CSV data
my $file = 'something.csv';

my $csv = Text::CSV->new;
open my $fh, '<', $file or die "Could not open $file: $!";

while( my $row = $csv->getline( $fh ) ) { 
    shift @$row;        # throw away first value
    push @data, $row;
}

Это позволит получить все ваши строки в @data, не беспокоясь о синтаксическом анализе CSV самостоятельно.

3 голосов
/ 26 октября 2011

Если вы когда-нибудь достигнете цикла C в стиле C, то есть большая вероятность, что дизайн вашей программы может быть улучшен.

while (<IN>) {
    chomp;

    my @cols = split(/,/); 
    shift(@cols); #to remove the first number which is a line header

    push @array, \@cols;
}

Предполагается, что у вас есть файл CSV, который можно обработать простым split (то есть записи не содержат запятых).

2 голосов
/ 26 октября 2011

В стороне: Вы можете упростить свой код с помощью:

my @cols = split /,/;

В вашем назначении $array[$col][$row] используется необычный порядок индексации;это усложняет жизнь.С вашим порядком присваивания столбцов / строк в массиве, я не думаю, что есть более простой способ сделать это.


Альтернатива: Если бы вы перевернулиПорядок индексов в массиве ($array[$row][$col]), вы можете подумать об использовании:

use strict;
use warnings;

my @array;
for (my $j = 0; <>; $j++) # For testing I used <> instead of <IN>
{
    chomp;
    $array[$j] = [ split /,/ ];
    shift @{$array[$j]};   # Remove the line label
}

for (my $i = 0; $i < scalar(@array); $i++)
{
    for (my $j = 0; $j < scalar(@{$array[$i]}); $j++)
    {
        print "array[$i,$j] = $array[$i][$j]\n";
    }
}

Пример данных

label1,1,2,3
label2,3,2,1
label3,2,3,1

Пример вывода

array[0,0] = 1
array[0,1] = 2
array[0,2] = 3
array[1,0] = 3
array[1,1] = 2
array[1,2] = 1
array[2,0] = 2
array[2,1] = 3
array[2,2] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...