gpt4 book ai didi

perl - 将大文件读入 Perl 数组数组并根据不同目的操作输出

转载 作者:行者123 更新时间:2023-12-02 08:58:40 25 4
gpt4 key购买 nike

我对 Perl 比较陌生,只用它来将小文件转换为不同的格式以及在程序之间提供数据。

现在,我需要加强一点。我有一个 5,905 行长的 DNA 数据文件,每行 32 个字段。这些字段不受任何内容分隔,并且行内的长度各不相同,但在所有 5905 行中每个字段的大小相同。

我需要将文件中的每一行输入到一个单独的数组中,并将该行中的每个字段存储为自己的变量。我在存储一行时没有问题,但在整个文件中连续存储每一行​​时遇到困难。

这就是我将完整数组的第一行分成各个变量的方法:

my $SampleID = substr("@HorseArray", 0, 7);
my $PopulationID = substr("@HorseArray", 9, 4);
my $Allele1A = substr("@HorseArray", 14, 3);
my $Allele1B = substr("@HorseArray", 17, 3);
my $Allele2A = substr("@HorseArray", 21, 3);
my $Allele2B = substr("@HorseArray", 24, 3);

...等等

我的问题是:1)我需要将 5905 行中的每一行存储为单独的数组。 2) 我需要能够根据样本 ID 引用每一行,或根据总体 ID 引用一组行并对它们进行排序。

一旦在变量中定义数据,我就可以很好地对数据进行排序和操作,我只是在使用每个字段构造多维数组时遇到困难,这样我就可以随意引用每一行。非常感谢任何帮助或指导。我已经仔细阅读了这里的问答部分,但还没有找到我的问题的答案。

最佳答案

不要将每一行存储在它自己的数组中。您需要构建一个数据结构。首先阅读 perldoc 中的以下教程:

这是一些起始代码:

use strict;
use warnings;

# Array of data samples. We could use a hash as well; which is better
# depends on how you want to use the data.
my @sample;

while (my $line = <DATA>) {
chomp $line;

# Parse the input line
my ($sample_id, $population_id, $rest) = split(/\s+/, $line, 3);

# extract A/B allele pairs
my @pairs;
while ($rest =~ /(\d{1,3})(\d{3})|(\d{1,3}) (\d{1,2})/g) {
push @pairs, {
A => defined $1 ? $1 : $3,
B => defined $2 ? $2 : $4,
};
}

# Add this sample to the list of samples. Store it as a hashref so
# we can access attributes by name
push @sample, {
sample => $sample_id,
population => $population_id,
alleles => \@pairs,
};
}


# Print out all the values of alleles 2A and 2B for the samples in
# population py18. Note that array indexing starts at 0, so allele 2
# is at index 1.
foreach my $sample (grep { $_->{population} eq 'py18' } @sample) {
printf("%s: %d / %d\n",
$sample->{sample},
$sample->{alleles}[1]{A},
$sample->{alleles}[1]{B},
);
}

__DATA__
00292-97 py17 97101 129129 152164 177177 100100 134136 163165 240246 105109 124124 166166 292292 000000 000000 000000
00293-97 py18 89 97 129139 148154 179179 84 90 132134 167169 222222 105105 126128 164170 284292 000000 000000 000000
00294-97 py17 91 97 129133 152154 177183 100100 134140 161163 240240 103105 120128 164166 290292 000000 000000 000000
00295-97 py18 97 97 131133 148162 177179 84100 132134 161167 240252 111111 124128 164166 284290 000000 000000 000000

关于perl - 将大文件读入 Perl 数组数组并根据不同目的操作输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3016177/

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