2012-01-24 23 views
7

Soy nuevo en D y me gustaría analizar un archivo biológica de la formaanálisis de un archivo con D

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

tal que puedo capturar el nombre1 'encabezados', nombre2, nombre3 con la secuencia correspondiente' 'datos, el ..acgcg ... cosas.

ahora tengo this.but será única línea de iterar por línea,

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; 
} 

me gustaría saber una buena manera de extraer la cabecera y los datos de la secuencia tal que puedo crear una matriz asociativa, donde cada elemento corresponde a una entrada en el archivo

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

D parece ser muy popular entre los bioinformáticos :) – Trass3r

Respuesta

8

el encabezado está en su propia línea, ¿verdad? ¿por qué no comprueba para ello y utilizar un appender para asignar el valor

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 

mapa es donde se almacenan los valores (un string[string] va a hacer)

+0

muchas gracias! el encabezado está en su propia línea. No entiendo de dónde viene c.hit :) ¿Por qué deberíamos asignar entry_name como objeto de coincidencia? (Se supone que es una expresión regular). y finalmente, ¿cuál es el tipo de mapa [nombre]? Lo siento, soy un n00b sobre esto en este momento. – eastafri

+0

Obteniendo algunos errores de compilación (dmd2): expresión entry_name de tipo Regex! (Char) no tiene un valor booleano read_file.d (37): Error: mapa identificador indefinido, ¿quiso decir función main? read_file.d (39): Error: no se puede convertir implícitamente la expresión (c.hit()) del tipo char [] a la cadena read_file.d (42): Error: no hay propiedad 'append' para el tipo 'Appender! (Char []) ' archivo_de_lectura.d (45): Error: mapa identificador indefinido, ¿quiso decir función principal? read_file.d (49): Error: identificador indefinido FileExceptio – eastafri

+0

@eastafri hizo una edición para corregir algunos de esos errores –

5

Aquí está mi solución sin expresiones regulares (I no creo ni por dicha entrada sencilla que necesitamos expresión regular):

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 buena idea! ¡Gracias! – eastafri