我正在尝试读取具有如下数据的csv文件:
++++++++++++++++++++++++++++
My1,10,20,30,40,50,60,70
My2,10,20,30,40,50,60
My3,10,20,30,40,50,60,70,80
++++++++++++++++++++++++++++
现在,我要将My,My1 ....存储在其中,@names
并将每行中的数字存储到中@numbers
。
到目前为止,我已经编写了这段代码
use strict;
use warnings;
use Text::CSV;
my $file = "result.csv";
my @names = undef;
my @numbers = undef;
open my $fh, "<", $file or die "$file: $!";
my $csv = Text::CSV->new ({
binary => 1,
auto_diag => 1,
});
shift(@names);
shift(@numbers);
while (my $row = $csv->getline ($fh)) {
push(@names,$row->[0]);
push(@numbers,$row->[1...5]);
}
close $fh;
for my $i ( 0 .. $#names ) {
print "names:$names[$i] \tNumbers:$numbers[$i] \n";
}
但是此代码不起作用,仅当我@numbers
在打印时使用时,它才会在所有名称前面打印所有数字
也许我不明白这个问题,但是这里有可能的解决方案:
读:
...
my @names = ();
my @numbers = ();
open CSVFILE, 'result.csv';
my $j = 0;
while (my $line = <CSVFILE>) {
chomp;
my @csv_line = split(/\s?,\s?/, $line);
push @names, $csv_line[0]; #or $names[$j] = $csv_line[0];
for (my $i = 1; $i <= $#csv_line; $i++) {
$numbers[$j][$i] = $csv_line[$i]; # $i-th number, for the $j-name
}
$j++;
}
close(CSVFILE);
写作:
...
my $name;
my @numbers;
my $new_line = join(',', ($name, @numbers));
open CSVFILE, '>>result.csv';
print CSVFILE "$new_line\n";
close CSVFILE;
印刷:
...
my $M = $names;
for (my $i = 0; $i < $M; $i++) {
print $names[$i] . ":\n ";
my $N = $numbers[$i];
for (my $k = 0; $k < $N; $k++) {
print $numbers[$i][$k] . " ";
}
print "\n";
}
...
印刷:
My1:
10 20 30 40 50 60 70
My2:
10 20 30 40 50 60
My3:
10 20 30 40 50 60 70 80
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句