2012-01-24 16 views
7

Sono nuovo in D e vorrei analizzare un file biologica della formaanalisi di un file con D

>name1 
acgcgcagagatatagctagatcg 
aagctctgctcgcgct 
>name2 
acgggggcttgctagctcgatagatcga 
agctctctttctccttcttcttctagagaga 
>name2 
gag ggagag 

tale che posso catturare il nome1 'intestazioni', nome2, NAME3 con il corrispondente 'sequenza di 'dati, il ..acgcg ... roba.

ora ho this.but sarà solo linea di iterare per riga,

import std.stdio; 
import std.stream; 
import std.regex; 


int main(string[] args){ 
    auto filename = args[1]; 
    auto entry_name = regex(r"^>(.*)"); //captures header only 
    auto fasta_regex = regex(r"(\>.+\n)([^\>]+\n)"); //captures header and correponding sequence 

    try { 
    Stream file = new BufferedFile(filename); 
    foreach(ulong n, char[] line; file) { 
     auto name_capture = match(line,entry_name); 
     writeln(name_capture.captures[1]); 
    } 

    file.close(); 
    } 
    catch (FileException xy){ 
    writefln("Error reading the file: "); 
    } 

    catch (Exception xx){ 
    writefln("Exception occured: " ~ xx.toString()); 
    } 
    return 0; 
} 

vorrei sapere un bel modo di estrarre l'intestazione ei dati di sequenza in modo tale che posso creare un array associativo in cui ogni articolo corrisponde ad una voce nel file

[name1:acgcgcagagatatagctagatcgaagctctgctcgcgct,name2:acgggggcttgctagctcgatagatcgaagctctctttctccttcttcttctagagaga,.....] 
+2

D sembra essere popolare tra i bioinformatici :) – Trass3r

risposta

8

l'intestazione si trova sulla propria riga destra? quindi perché non per esso e utilizzare un appender da allocare per il valore

auto current = std.array.appender!(char[]); 
string name; 
foreach(ulong n, char[] line; file) { 
     auto entry = match(line,entry_name); 
     if(entry){//we are in a header line 

      if(name){//write what was caught 
       map[name]=current.data.dup;//dup because .current.data is reused 
      } 
      name = entry.hit.idup; 
      current.clear(); 
     }else{ 
      current.put(line); 
     } 
} 
map[name]=current.data.dup;//remember last capture 

mappa è dove si memorizzano i valori (un string[string] farà)

+0

molte grazie! l'intestazione è sulla propria linea. Non capisco da dove provenga c.hit :) Anche perché dovremmo assegnare entry_name come oggetto match? (Si suppone che sia una regex). e infine qual è il tipo di mappa [nome]? Scusa, sono un n00b su questo al momento. – eastafri

+0

Ottenere alcuni errori di compilazione (dmd2): espressione nome_pzione di tipo Regex! (Char) non ha valore booleano read_file.d (37): Errore: mappa identificativa indefinita, intendevi funzione principale? read_file.d (39): Errore: impossibile convertire implicitamente (c.hit()) di tipo char [] in stringa read_file.d (42): Errore: nessuna proprietà 'append' per tipo 'Appender! (Char []) ' read_file.d (45): Errore: mappa identificativa indefinita, intendi la funzione main? read_file.d (49): Errore: identificatore non definito FileExceptio – eastafri

+0

@eastafri ha apportato una modifica per correggere alcuni di questi errori –

5

Ecco la mia soluzione senza le espressioni regolari (I non ci credo per come semplice ingresso abbiamo bisogno regexp):

import std.stdio; 
import std.stream; 

int main(string[] args) { 
    int ret = 0; 
    string fileName = args[1]; 
    string header; 
    char[] sequence; 
    string[string] content; 
    try { 
    auto file = new BufferedFile(fileName); 
    foreach(ulong lineNumber, char[] line; file) { 
     if (line[0] == '>') {  
     if (header.length > 0) { 
      content[header] = sequence.idup; 
      sequence.length = 0; 
     } // if 
     // we have a new header, and new sequence will start after it 
     header = line[1..$].idup; 
     content[header] = ""; 
     } else { 
      sequence ~= line; 
     } // else 
    } // foreach 
    content[header] = sequence.idup; 
    file.close(); 
    } 
    catch (OpenException oe){ 
    writefln("Error opening file: " ~ oe.toString()); 
    } 
    catch (Exception e){ 
    writefln("Exception: " ~ e.toString()); 
    } 
    writeln(content); 
    return ret; 
} // main() function 

/+ -------------------------- BEGIN OUTPUT ------------------------------- + 
["name3":"gag ggagag", "name1":"acgcgcagagatatagctagatcgaagctctgctcgcgct", "name2":"acgggggcttgctagctcgatagatcgaagctctctttctccttcttcttctagagaga"] 
+ -------------------------- END OUTPUT --------------------------------- +/ 
+0

oh bella idea! Grazie! – eastafri