0

我正在尝试以可以访问一行中每一列的方式将 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

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

4

2 回答 2

4

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

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

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

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

您还应该考虑使用

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

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

于 2013-04-04T16:45:11.707 回答
1

我建议避免直接解析 CSV 文件并使用Text::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;
于 2013-04-04T17:11:12.027 回答