2014-03-18 106 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: $!";