用D解析文件

eas*_*fri 7 parsing d dmd

我是D的新手,想要解析表格的生物文件

>name1
acgcgcagagatatagctagatcg
aagctctgctcgcgct
>name2
acgggggcttgctagctcgatagatcga
agctctctttctccttcttcttctagagaga
>name2
gag ggagag
Run Code Online (Sandbox Code Playgroud)

这样我就可以捕获'header'name1,name2,name3以及相应的'sequence'数据,..acgcg ... stuff.

现在我有了这个.但它只会逐行迭代,

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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道一种提取标题和序列数据的好方法,这样我就可以创建一个关联数组,其中每个项目对应于文件中的一个条目

[name1:acgcgcagagatatagctagatcgaagctctgctcgcgct,name2:acgggggcttgctagctcgatagatcgaagctctctttctccttcttcttctagagaga,.....]
Run Code Online (Sandbox Code Playgroud)

rat*_*eak 8

标题是在它自己的行上吗?那么为什么不检查它并使用appender来分配值

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
Run Code Online (Sandbox Code Playgroud)

map是你将存储值的地方(string[string]将会这样做)

  • @eastafri你不重复一个字符串,然后把它转换为字符串来获取一个字符串.你想要它.dup返回调用它的数组的可变副本.idup返回它被调用的数组的不可变副本. (2认同)