2014-03-18 140 views
1

我想加載一個CSV文件,轉置它,並寫一個新的。除了編寫一個新文件之外,我的一切都正常工作。我在網上瀏覽過沒有成功。從2d陣列創建CSV文件perl

use strict; 
use warnings; 
use Text::CSV; 
use Data::Dump qw(dump); 
use Array::Transpose; 

my @data; # 2D array for CSV data 
my $file = 'sample_array.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=transpose(\@data); 
dump(@data); 

這裏的輸出是轉置數組@data (["blah", 23, 22, 43], ["tk1", 1, 11, 15],["huh", 5, 55, 55])。我需要將輸出寫入新的CSV文件。

CSV文件:

text,blah,tkl,huh 
14,23,1,5 
12,22,11,55 
23,42,15,55 
+1

您不需要同時使用'Text :: CSV'和'Text :: CSV_XS'。如果你安裝了'Text :: CSV_XS','使用Text :: CSV;'實際上會自動使用'Text :: CSV_XS'。 – ThisSuitIsBlackNot

+0

的確,我應該刪除它從之前的嘗試中複製過來的。 – snoop

回答

1

參考代碼dump後。這是從Text::CSV衍生提要:

use strict; 
use warnings; 
use Text::CSV; 
use Data::Dump qw(dump); 
use Array::Transpose; 

my @data; # 2D array for CSV data 
my $file = 'sample_array.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=transpose(\@data); 
dump(@data); 

open $fh, ">:encoding(utf8)", "new.csv" or die "new.csv: $!"; 
for (@data) { 
    $csv->print($fh, $_); 
    print $fh "\n"; 
} 
close $fh or die "new.csv: $!"; 
+1

啊,我正在給那個網站打分。也許太久了,因爲我沒有看到。非常感謝 – snoop

0

隨着Toolic的除了我不得不做出一些修改,由於特定類型我正在處理的數據。這是一個非常大的一組工程符號&單位和負數小數字。作爲參考,我的最終代碼如下。

use strict; 
use warnings; 
use Text::CSV; 
use Data::Dump qw(dump); 
use Array::Transpose; 
my @data; # 2D array for CSV data 
my $file = 'rawdata.csv'; 

my $csv = Text::CSV->new({ binary => 1, quote_null => 0 }); 
open my $fh, '<', $file or die "Could not open $file: $!"; 

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

@data=transpose(\@data); 

open $fh, ">:encoding(utf8)", "rawdata_trans.csv" or die "rawdata_trans.csv: $!"; 
for (@data) { 
$csv->print($fh, $_); 
print $fh "\n"; 
} 
close $fh or die "rawdata_trans.csv: $!";