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

Perl 将制表符分隔的文件解析为数组,perl,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; foreac

我正在尝试将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]);
}

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

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

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

foreach (@data){
    print $_->[$idcol], "\n";
}
@
是一个与
$完全不同的变量,此处未填充

你也应该考虑使用< /P>

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

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

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

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

foreach (@data){
    print $_->[$idcol], "\n";
}
@
是一个与
$完全不同的变量,此处未填充

你也应该考虑使用< /P>

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

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

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

使用Text::CSV;
使用鲤鱼;
#设置命令行参数
my($infi、$outdir、$idcol)=@ARGV;
my$csv=文本::csv->新建({
sep_char=>“\t”
});

打开(my$fh),我建议避免直接解析CSV文件并使用模块

使用Text::CSV;
使用鲤鱼;
#设置命令行参数
my($infi、$outdir、$idcol)=@ARGV;
my$csv=文本::csv->新建({
sep_char=>“\t”
});

打开(我的$fh,”你确定不应该使用散列而不是数组吗?散列是否等同于python字典?如果是,那么是的,使用它更有意义。你确定不应该使用散列而不是数组吗?散列是否等同于python字典?如果是,那么是的,使用它更有意义。定义非常明确简单地说,数据不能包含制表符。没有引号或转义符,因此解析制表符分隔数据的正确方法是使用简单的
split/\t/
。要正确设置
Text::CSV
,您还必须抑制
quote\u char
escape\u char
,并且它应该只在制表符上进行拆分,模块失去了所有的价值。谢谢你的提示,但提问者说“我正在尝试阅读CSV”,所以我不能假设该文件不包含引号或转义字符…这显然是一个错误的概念,因为CSV根据定义是逗号分隔的。很抱歉弄错了。我正在解析带有引号字符的基因注释,因为注释在阳光下与每个字符和分隔符一起打包。我弄错了CSV和TSV,因为我以两种形式找到的文件。我不知道TSV不允许使用我一直发现的字符,但生物学家再次制作了这些文件…文件的定义非常简单,因此数据不能包含制表符。没有引号或转义符,因此解析制表符分离数据的正确方法是使用简单的
split/\t/
。要正确设置
Text::CSV
,您还必须抑制
quote\u char
escape\u char
,它应该只在选项卡上拆分,模块将失去其所有价值。谢谢提示,但提问者说“我正在尝试读取CSV”,所以我不能假设该文件不包含引号或转义字符…这显然是一个错误的概念,因为CSV根据定义是逗号分隔的。很抱歉弄错了。我正在解析带有引号字符的基因注释,因为注释在阳光下与每个字符和分隔符一起打包。我弄错了CSV和TSV,因为我以任何一种形式向我提供的文件。我不知道TSV不允许我一直发现的这些字符,但生物学家再次制作了这些文件。。。