2012-01-24 43 views
7

Tôi mới trong D và muốn phân tích một tập tin sinh học của mẫuPhân tích một tập tin với D

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

như vậy mà tôi có thể nắm bắt được name1 'tiêu đề', name2, name3 với 'chuỗi tương ứng 'dữ liệu, công cụ ..acgcg ....

Bây giờ tôi có this.but nó sẽ dòng chỉ lặp theo dòng,

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

Tôi muốn biết một cách tốt đẹp của giải nén header và dữ liệu chuỗi như vậy mà tôi có thể tạo ra một mảng kết hợp nơi mỗi mục tương ứng với một mục trong tệp

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

D dường như phổ biến trong số các nhà sinh hóa học) – Trass3r

Trả lời

8

tiêu đề nằm trên dòng riêng của nó phải không? vậy tại sao không kiểm tra nó và sử dụng một appender phân bổ cho giá trị

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 

bản đồ là nơi bạn sẽ lưu trữ các giá trị (một string[string] sẽ làm)

+0

cảm ơn nhiều! tiêu đề nằm trên một dòng riêng. Tôi không hiểu nơi c.hit đến từ :) Ngoài ra tại sao chúng ta nên phân bổ entry_name như là một đối tượng phù hợp? (Nó được coi là một regex). và cuối cùng là loại bản đồ [tên]? Xin lỗi, tôi là một n00b về việc này vào lúc này. – eastafri

+0

Bắt một số lỗi biên dịch (dmd2): biểu thức entry_name loại Regex! (Char) không có giá trị boolean read_file.d (37): Lỗi: bản đồ định danh không xác định, ý của bạn là hàm main? read_file.d (39): Lỗi: không thể chuyển đổi hoàn toàn biểu thức (c.hit()) của kiểu char [] thành chuỗi read_file.d (42): Lỗi: không có thuộc tính 'chắp thêm' cho kiểu 'Appender! (Char []) ' read_file.d (45): Lỗi: bản đồ định danh không xác định, ý của bạn là hàm main? read_file.d (49): Lỗi: định danh không xác định FileExceptio – eastafri

+0

@eastafri thực hiện chỉnh sửa để khắc phục một số lỗi đó –

5

Đây là giải pháp của tôi mà không biểu thức thông thường (I đừng tin vào đầu vào đơn giản như vậy, chúng ta cần 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

ý tưởng hay! cảm ơn! – eastafri

Các vấn đề liên quan