我有一个没有标题的文本文件,格式如下:
2017-03-13 00,r1,306011,306011,OK,Allgood. 2017-03-13 01,r2,20369,20369,OK,Allgood. 2017-03-13 02,r3,283751,283751,OK,Allgood. 2017-03-13 03,r4,53017,53017,OK,Allgood.
如何在perl中将此文件提取到数组?我想用循环打印出来。
my $s_size = scalar(@array);
for(my $i=1; $i<=$s_size;$i++)
{
print ("$array[$i][0]\n");
print ("$array[$i][1]\n");
}
预期结果:
2017-03-13 00 2017-03-13 01 2017-03-13 02 2017-03-13 03 r1 r2 r3 r4
答案 0 :(得分:2)
可能的解决方案之一可能是
use 5.014;
use warnings;
my @lines;
while(<>) {
chomp;
push @lines, [split /\s*,\s*/];
}
say $_->[0] for @lines;
say $_->[1] for @lines;
输出
2017-03-13 00
2017-03-13 01
2017-03-13 02
2017-03-13 03
r1
r2
r3
r4
正如@Sobrique和@BOC所说,你可以使用
my @lines = map { chomp; [split /,/] } <>;
say $_->[0] for @lines;
say $_->[1] for @lines;
最后由
$filename
use 5.014;
use warnings;
use Text::CSV;
my $filename = "xd.csv";
my $csv = Text::CSV->new({auto_diag => 1, binary => 1});
open my $fh, '<', $filename or die "$filename: $!";
my $lines = $csv->getline_all($fh); #note the arrayref
close($fh);
say $_->[0] for @$lines;
say $_->[1] for @$lines;
答案 1 :(得分:1)
我认为预期结果和打印循环存在一些错误。我将如何做到这一点:
my $filename='/path/test.txt';
open (my $fh, '<', $filename) or die "Can't open $filename: $!";
my @array;
while (my $line = <$fh>) {
chomp $line;
push @array, [split ',', $line];
}
my $s_size = scalar(@array);
for(my $i=0; $i<$s_size;$i++)
{
print ("$array[$i][0]\n");
print ("$array[$i][1]\n");
}
结果是:
2017-03-13 00
r1
2017-03-13 01
r2
2017-03-13 02
r3
2017-03-13 03
r4
如果您愿意,我们也可以在一行中完成:
my @array = map {chomp; [split ',']} <>;
答案 2 :(得分:1)
我认为你的要求会有所混淆。您的预期输出似乎与您的代码所要提供的输出无关。如果我们保留代码,这将为您提供输出(给定此文件名):
use strict;
use warnings;
my $filename = '/path/to/file';
open my $FILE, '<', $filename or die $!;
while(my $line = <$FILE>) {
chomp $line;
my @array = split(/,/, $line);
print "$array[0]\n";
print "$array[1]\n";
}
close $FILE;
这简化了您的代码。如果您希望它与预期输出一样,只需push @array2, $array[1]
(此处,@array2
是您需要声明的新数组)并在while
循环后打印它。