gpt4 book ai didi

perl - 处理制表符分隔的文件并将字段存储在复杂的数据结构中

转载 作者:行者123 更新时间:2023-12-02 07:02:51 28 4
gpt4 key购买 nike

我正在尝试处理以下文件:

http://bioinfo.mc.vanderbilt.edu/TSGene/Human_716_TSGs.txt

...包含 700 多条记录,每条记录有 11 个制表符分隔的字段。每条记录都包含相同的重复类别,即 GeneID、Gene_symbol、Alias、Xref、Chromosome、Cytoband、Full_name、Gene_type、Description、Nucleotide_Sequence 和 Protein_Sequence。我想提取所有的 GeneID(所有记录中的第一个字段)、所有的细胞带和所有的蛋白质序列,并构建一个复杂的数据结构,例如:

$genes->{$gene_name}{$cytoband} = $protein_sequence;

我的问题是我只能获取第一条记录(11 个字段)并将它们分配给列表。我不知道如何捕获和存储构成一列的所有字段。我的初步尝试如下:

use strict;
use warnings;
use autodie;

my ($gene, $symbol, $alias, $xref,
$chromo, $cytoband, $full_name, $gene_type, $desc, $nuc_seq, $pro_seq);

open FH, '<', 'human_tsgs.txt';
my @data = do {local $/; <FH>};
close FH;

for (@data)
{
($gene, $symbol, $alias, $xref, $chromo, $cytoband,
$full_name, $gene_type, $desc, $nuc_seq, $pro_seq) = split "\t", $_;

#print $gene, "\n";
}

我们将不胜感激任何建设性的反馈。

谢谢!

凯特琳

最佳答案

问题在于您读取文件的方式。您通过在 block 中将其设为 local 来取消定义 $/

这是因为这个原因发生的事情:

  • 如果是$/,就是the input line seperator , 是undef,它会将整个文件读成一行。
  • 因此,@data 将只有一个包含整个文件的元素。
  • 稍后,当您在 for 循环中对其进行迭代时,您会在 $_ 中获得整个文件。
  • split 将为您提供所有字段(尽管第 11 个字段应该有 value_row1_11\nvalue_row2_1
  • 不过,您还没有看到,因为您的调试只有 print $gene,这是第一个值。

您需要做的是逐行读取文件。没有必要为此干预 $/

open my $fh, '<', 'human_tsgs.txt' or die $!;
while ( my $line = <$fh> ) {
chomp $line;
my ( $gene, $symbol, $alias, $xref, $chromo, $cytoband, $full_name,
$gene_type, $desc, $nuc_seq, $pro_seq ) = split "\t", $line;
}
close $fh;

如果您在某个时候有较大的文件,逐行读取它也有利于内存处理。如果你 slurp 整个文件,你需要将它存储在内存中。这样,您一次只需要存储一行来处理数据。


实现此目的的另一种方法是使用 Text::CSV模块。

关于perl - 处理制表符分隔的文件并将字段存储在复杂的数据结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17482103/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com