将制表符分隔文件解析为数组

时间:2013-04-04 16:40:41

标签: perl

我试图以一种可以连续访问每列的方式将CSV读入数组。但是,当我运行以下代码,目的是从每行打印一个特定列时,它只输出空行。

#set command line arguments
my ($infi, $outdir, $idcol) = @ARGV;

#lead file of data to get annotations for
open FILE, "<", $infi or die "Can't read file '$infi' [$!]\n";
my @data;
foreach my $row (<FILE>){
    chomp $row;
    my @cells = split /\t/, $row;
    push @data, @cells;
}


#fetch genes
foreach (@data){
    print "@_[$idcol]\n";
#    print $geneadaptor->fetch_by_dbID($_[$idcol]);
}

测试输入

a       b       c
1       2       3
d       e       f
4       5       6

我认为这里的问题不是加载文件,而是处理生成的数组。我该如何处理这个问题呢?

2 个答案:

答案 0 :(得分:4)

首先,您需要push @data, \@cells,否则您将把所有字段连接到一个列表中。

然后你需要在第二个for循环中使用循环值。

foreach (@data){
    print $_->[$idcol], "\n";
}

@_是与$_完全不同的变量,在此处未填充。

您还应该考虑使用

while (my $row = <FILE>) { ... }

阅读你的文件。它一次只读取一行,而for会在迭代之前将整个文件读入一个行列表。

答案 1 :(得分:1)

我建议避免直接使用Text::CSV模块解析CSV文件。

use Text::CSV;
use Carp;

#set command line arguments
my ($infi, $outdir, $idcol) = @ARGV;

my $csv = Text::CSV->new({
  sep_char => "\t"
});

open(my $fh, "<:encoding(UTF-8)", $infi) || croak "can't open $infi: $!";

# Uncomment if you need to skip header line
# <$fh>;

while (<$fh>) {
    if ($csv->parse($_)) {
        my @columns = $csv->fields();
        print "$columns[0]\t$columns[1]\t$columns[2]\n";
    } else {
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}
close $fh;