我试图以一种可以连续访问每列的方式将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
我认为这里的问题不是加载文件,而是处理生成的数组。我该如何处理这个问题呢?
答案 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;