如何在perl中将文本文件提取到数组

时间:2017-03-14 08:30:37

标签: perl

我有一个没有标题的文本文件,格式如下:

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

3 个答案:

答案 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;

最后由

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循环后打印它。