我正在阅读包含DNA序列的大文件。这些是很长的字符,我需要从文件中的某个位置获得某个子集(我有开始和停止位置)。由于文件太大,我使用BufferedReader()
来阅读。这一次读取一行,但我想要的子集可能不止一个。我只有在整个DNA序列表示为没有换行符的一行时才有意义的开始和停止位置。实际上,遗憾的是,这些文件确实包含换行符。因此,对于每一行,索引从0到结束,而不是0到20,21到40,41到60等。例如。
我的问题/疑问:逐行读取文件,但保存可能跨多行的子集/子字符串。我尝试了几种方法,但无法提取我想要的子字符串。我怀疑我自己的逻辑/思想是有缺陷的,或者有一种我还没有意识到的方法。有更好的方法吗?
方法1:
public String getSubSequence() {
fileLocation = "genome.fna";
String referenceGenomeSub = "";
int passedLetters = 0;
int passedLines = 0;
//start- and stop position
int start = 50;
int stop = 245;
Path path = Paths.get(fileLocation);
try (BufferedReader br = Files.newBufferedReader(path, Charset.defaultCharset())){
String line;
while ((line = br.readLine()) != null) {
if (!line.startsWith(">")) {//Don't need lines that start with >
passedLines++;
//edit indices so I don't get out of bounds
if (linesPassed != 1) {
start = start - passedLetters;
stop = stop - passedLetters;
}
//this is to know where I am in the file
passedLetters = passedLetters + line.length();
//if the subset is on only one line
if (start < passedLetters && stop <= passedLetters) {
referenceGenomeSub = referenceGenomeSub.concat(line);
}
//subsequence is on multiple lines
else if (start <= passedLetters && stop > passedLetters) {
referenceGenomeSub = line.substring(start);
}
else if (passedLetters > stop && !referenceGenomeSub.isEmpty()) {
referenceGenomeSub = referenceGenomeSub.concat(line.substring(0, stop));
}
}
}
br.close();
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
在这里,我尝试跟踪已经传递的字符数。这就是我知道什么时候我在所需子串的范围内
结果:StringIndexOutOfBoundsException
我的另一种方法是将所有行保存到具有停止位置的行。然后我提取一个子字符串。这不是首选,因为我的esired子集可能位于文件的末尾。
条件:
- 记忆友好
- 如果可能的话,没有BioJava。我还在学习编程,所以我想不用这样做。即使这是艰难的方式
不寻找固定代码,但是一些文章/示例让我走上正轨非常好。我现在正在看我的屏幕几个小时而没有取得进展,现在我的想法有点空白。正如我所说的那样,这个问题可能是有缺陷的思考,也可能是对这项工作更好的方法/技术的遗忘。