/ / Czytaj plik CSV i zapisz w tablicy 2D - tablice, perl

Czytaj plik CSV i zapisz w tablicy 2d - tablice, perl

Próbuję odczytać ogromny plik CSV w tablicy 2 D, musi być lepszy sposób na podzielenie linii i zapisanie jej w tablicy 2 D w jednym kroku: s Twoje zdrowie

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++;
}

Odpowiedzi:

12 dla odpowiedzi № 1

CSV nie jest trywialny. Nie analizuj go samodzielnie. Użyj modułu takiego jak Tekst :: CSV, który zrobi to poprawnie i szybko.

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;
}

To ładnie wprowadzi wszystkie twoje wiersze @databez martwienia się o samodzielne analizowanie pliku CSV.


3 dla odpowiedzi № 2

Jeśli kiedykolwiek zdarzy ci się sięgnąć po pętlę for w stylu C, istnieje duża szansa, że ​​projekt twojego programu będzie mógł zostać ulepszony.

while (<IN>) {
chomp;

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

push @array, @cols;
}

Zakłada się, że masz plik CSV, który można przetworzyć za pomocą prostego pliku split (tj. rekordy nie zawierają osadzonych przecinków).


2 dla odpowiedzi nr 3

Na bok: Możesz uprościć swój kod za pomocą:

my @cols = split /,/;

Twoje zadanie do $array[$col][$row] używa nietypowej kolejności indeksów; komplikuje życie. Biorąc pod uwagę kolejność przypisania kolumn / wierszy w tablicy, nie sądzę, aby istniał prostszy sposób na zrobienie tego.


Alternatywny: Gdybyś miał odwrócić kolejność indeksów w tablicy ($array[$row][$col]), możesz pomyśleć o użyciu:

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";
}
}

Przykładowe dane

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

Przykładowy wynik

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