如何在perl中通过for循环控件打开和读取文件
我的文件夹里有很多文件。我想根据参考文件的顺序打开并读取它们。 我的文件名:如何在perl中通过for循环控件打开和读取文件,perl,loops,for-loop,Perl,Loops,For Loop,我的文件夹里有很多文件。我想根据参考文件的顺序打开并读取它们。 我的文件名: AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.3.fa AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.4.fa . . . 参考文件结构: chr1 744 745 chr1 120
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.3.fa
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.4.fa
.
.
.
参考文件结构:
chr1 744 745
chr1 1208 1209
chr2 1250 1251
chr2 1454 1455
chr3 1676 1677
chr3 1683 1684
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa
>1 dna:
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTATGTGAGAAGATAGCTGAA
CGCCTTGTCCACATCATCTTACTGCTGAGAGTTGAGCTCACCCTCAGTCCCTCACAGTTC
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa
>2 dna:
GAGAGCTGGCTTCTAGGCATGCTTCCTTTTGAGAGCTGAGGACAGGACAGAACCCTCCCG
CATCCTGCCTGACTGTAGACGTACCTGCTAACCTCCTCATGTTAGTGGCTGGGATAGATT
GTGGGAAAAGCATGTGTAAGCATTGGGCCTGAACTCCCGTGTATCTGAGTTGAATACAGC
GATTTCCAACATCCTTCTTCAATAGGAGTGTAGCTAGGTTCCAACTCCCATGTCCGAGTG
GGTAGCAGACATCTGCCTTCCATGCATACACACTTCTGAGAGTTGAGCTTATGGCCTGTA
ACCCTACCTCCTGCCTGCAGCTACCTTTTGCTTCCAAAAGTCCTAGGCTCGCTGCTTCAC
CAAAGTGTTGGGAGAGGTAACTGTTGTCTCCCGGCACACAAGACTAGTGCCTCCAAGCTC
AATCCAGCGATTTCCCAGTAATTCCTGGGTTAGACTGGTGCTACATACTAAGTTCCATAC
GTGAGTAGGTAGTTGAAAGCCTTGTCCAAAAACATCTTACTTCTGAGAGTTGAGCTCACC
CTCAGTCCCTCACAGTTCCACACTGCCTGCAGAGTGAGTTTCCCACGTCTTCATCAGAGA
CTTTTGCCAGAGGCTTCTGAGACGCAAGTTAACAATGCAAACAGGAGGGTATACCCAGGT
GCAGTAGATTGGTTATCTGGGAACCTCCTTACTCAGAATACTGTTACCTTCACACTGTCA
TAAGAATGCAGCTAGTTGAGAGCTGGCTTCTAGGCATGCTTCCCTGTGAGAGCTGAGGAC
输入文件结构:
chr1 744 745
chr1 1208 1209
chr2 1250 1251
chr2 1454 1455
chr3 1676 1677
chr3 1683 1684
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa
>1 dna:
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTATGTGAGAAGATAGCTGAA
CGCCTTGTCCACATCATCTTACTGCTGAGAGTTGAGCTCACCCTCAGTCCCTCACAGTTC
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa
>2 dna:
GAGAGCTGGCTTCTAGGCATGCTTCCTTTTGAGAGCTGAGGACAGGACAGAACCCTCCCG
CATCCTGCCTGACTGTAGACGTACCTGCTAACCTCCTCATGTTAGTGGCTGGGATAGATT
GTGGGAAAAGCATGTGTAAGCATTGGGCCTGAACTCCCGTGTATCTGAGTTGAATACAGC
GATTTCCAACATCCTTCTTCAATAGGAGTGTAGCTAGGTTCCAACTCCCATGTCCGAGTG
GGTAGCAGACATCTGCCTTCCATGCATACACACTTCTGAGAGTTGAGCTTATGGCCTGTA
ACCCTACCTCCTGCCTGCAGCTACCTTTTGCTTCCAAAAGTCCTAGGCTCGCTGCTTCAC
CAAAGTGTTGGGAGAGGTAACTGTTGTCTCCCGGCACACAAGACTAGTGCCTCCAAGCTC
AATCCAGCGATTTCCCAGTAATTCCTGGGTTAGACTGGTGCTACATACTAAGTTCCATAC
GTGAGTAGGTAGTTGAAAGCCTTGTCCAAAAACATCTTACTTCTGAGAGTTGAGCTCACC
CTCAGTCCCTCACAGTTCCACACTGCCTGCAGAGTGAGTTTCCCACGTCTTCATCAGAGA
CTTTTGCCAGAGGCTTCTGAGACGCAAGTTAACAATGCAAACAGGAGGGTATACCCAGGT
GCAGTAGATTGGTTATCTGGGAACCTCCTTACTCAGAATACTGTTACCTTCACACTGTCA
TAAGAATGCAGCTAGTTGAGAGCTGGCTTCTAGGCATGCTTCCCTGTGAGAGCTGAGGAC
我的输出:chr1a
chr1g
chr2c
chr2c
chr3 T
chr3 T 我可以使用bioperl找到位置,并一个接一个地打印出值(一个文件接一个文件) 然后我尝试打开并读取文件夹中的文件
my $dir = '/home/Documents/Folder/';
opendir(DIR, $dir) or die $!;
my @files = grep (/.fa$/, readdir(DIR));
for my $list(@files){ ##try to get the last number from file name##
my @lines = split /\./, $list}
打开并读取我的参考文件
open my $POS, '<', 'CanFam3_SNP_POS.txt' or die $!;
然后,我尝试使用循环控件根据参考文件第1列的值打开和读取文件。例如chr1,AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa应该被读取和处理。如果从参考文件中读取chr2,请中断循环,然后打开并读取AAAAA_aaaaaaa.CCCCC3.1.bbb.DDDDD.2.fa,使用chr2处理该文件
open my $fh, '<', "/home/Documents/Folder/$sorted[$i]" or die $!;
while (my $line = <$POS>){
chomp($line);
if ($line =~ /chr$lines[5]/g){
my @positions = split (/\t/, $line);
print "$positions[0]","\t","$positions[1]","\t", substr($so->seq(),
$positions[1], $positions[2] - $positions[1]),"\n";
last if ($line !~ /chr$lines[5]/g)
}
}
打开我的$fh,”这里的关键是只查看引用文件中给定行所需的特定FastA文件。从您发布的代码摘录来看,您似乎试图读取每一行的每一个文件(但没有做到这一点)
>请考虑以下内容:
#!/usr/bin/perl
use warnings;
use strict;
use autodie;
use feature qw/say/;
use File::Basename;
# Map the fasta files in a given directory to chr numbers.
my $fa_dir = '/home/Documents/Folder/';
my %fa_files =
map { (split /\./, fileparse($_, '.fa'))[5] => $_ } glob("$fa_dir/*.fa");
open my $chrs, '<', 'CanFam3_SNP_POS.txt';
# Read each line of the reference file
while (<$chrs>) {
chomp;
# Split up the chr and offsets
my @fields = split /\s+/, $_; #/
# Extract the chr number
my $chr = $fields[0];
$chr =~ s/^chr//; #/
warn "Unknown chr $chr!\n" and next unless exists $fa_files{$chr};
# And read from the appropriate fasta file
# You should probably use a library to read the file instead of
# this mess, but I don't know which ones are good. Based on your code
# you might be trying to use one already?
open my $fa, '<', $fa_files{$chr};
my $hdr = <$fa>;
my $data = join "", <$fa>;
$data =~ s/[^ACGT]+//sg;
close $fa;
# And display the requested part
warn "Invalid offset for chr $chr\n" and next unless length($data) > $fields[1];
my $range = substr $data, $fields[1], $fields[2] - $fields[1];
say "chr$chr $range";
}
#/usr/bin/perl
使用警告;
严格使用;
使用自动模具;
使用功能qw/say/;
使用File::Basename;
#将给定目录中的fasta文件映射到chr编号。
my$fa_dir='/home/Documents/Folder/';
我的%fa_文件=
映射{(split/\./,fileparse($\',.fa'))[5]=>$\}glob(“$fa\'dir/*.fa”);
打开我的$chrs,'$fields[1];
my$range=substr$data、$fields[1]、$fields[2]-$fields[1];
说“chr$chr$range”;
}
它将给定目录中的每个.fa
文件存储到哈希表中,由文件名的最后一个元素键入,该元素对应于引用文件中chr
之后的内容。这使得查找需要读取的确切文件以打印出请求的片段变得容易
还请注意使用读取文件名,而不是opendir()
/readdir()
。基于扩展名进行过滤更简单,并且使用以独立于操作系统的方式仅获取文件名减去路径和扩展名。如何将“chr1”、“chr2”等映射到fasta文件名?或者是吗?不,chr1和chr2…与文件名不匹配。只有当文件名与chr行不一致时,我才能从文件名的数字末尾识别。。。你怎么知道要查找什么文件?对于文件名,有些文件名为AAAAA_aaaaaaa.CCCCC3.1.bbb.DDDDD.X.fa;AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.MT.fa当我读取文件名末尾的数字时。我能理解这个文件是哪个chr的