как открыть и прочитать файл с помощью цикла управления в Perl - PullRequest
0 голосов
/ 15 октября 2018

У меня много файлов в папке.И я хочу открыть и прочитать их в порядке следования в зависимости от справочного файла.имя моего файла:

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 A
chr1 G
chr2 C
chr2 C
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 $!;

Я положил все файлы вмассив и сортировать их.

  my @sorted = @files;
  foreach my $i (0..$#sorted)

Затем я пытаюсь использовать элемент управления цикла, чтобы открыть и прочитать файл в зависимости от значений столбца справочного файла 1.Например, chr1, AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa необходимо прочитать и обработать.Если вы читаете chr2 из ссылочного файла, прервите цикл, а затем откройте и прочитайте AAAAA_AAAAA.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)

    }
 }

Я думаю, что яесть некоторые проблемы с этими кодами.Могу ли я использовать Perl для этого процесса?Я неправильно понимаю некоторые моменты?

1 Ответ

0 голосов
/ 15 октября 2018

Ключевым моментом здесь является поиск только в конкретном файле 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";
}

Он хранит каждый файл .fa в данном каталоге в хеш-таблице, ключом которого является последний элемент имени файла, соответствующий тому, что после chr в ссылочном файле.Это облегчает поиск точного файла, из которого нужно прочитать, чтобы распечатать запрошенный фрагмент.

Также обратите внимание на использование glob () для чтения имен файлов вместо opendir() / readdir().Проще фильтровать таким образом по расширению, используя File :: Basename , чтобы получить только имя файла без пути и расширения независимым от ОС способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...