使用BufferedReader

时间:2016-05-06 14:08:07

标签: java io substring bufferedreader bioinformatics

我正在阅读包含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。我还在学习编程,所以我想不用这样做。即使这是艰难的方式

不寻找固定代码,但是一些文章/示例让我走上正轨非常好。我现在正在看我的屏幕几个小时而没有取得进展,现在我的想法有点空白。正如我所说的那样,这个问题可能是有缺陷的思考,也可能是对这项工作更好的方法/技术的遗忘。

0 个答案:

没有答案