2016-07-27 59 views
0

我需要在給定偏移量所屬的文本中提取整行。例如:由於文本文件中某個單詞的偏移量,java程序應該檢索相應的行號

"Therapist: Okay. {Pause} 
So, how do you feel about -- about this -- about what's going on with your health? 

Participant: I don't like it. 
There's nothing I can do about it. 
{Pause} 

Therapist: Yeah.\ 

15-30-28-0140.raw 

Therapist: That doesn't sound so good. 
A little bit stressful." 

如果我索要offsetNum = 125的輸出將是「參與者:我不喜歡它。」 可以看出,空行應該被考慮。

我寫了下面的代碼,在一些文本文件,但搞砸了一些人的作品(不可靠):

int offset = startingOffset; 

       try (LineNumberReader r = new LineNumberReader(new FileReader(Input))) { 
        int count = 0; 

        while (r.read() != -1 && count < offset) 
        { 
         count++; 
        } 
        if (count == offset) 
        { 

          lineNo = r.getLineNumber() 
        } 

不過,我需要一個可靠的方式來獲得實際的行不lineNo的.. 。

+0

那是不是可靠? –

+0

從文件中讀取第一個「offset」字節(我假設它是一個字節偏移量?)。然後計算這些字節中的'\ n'字符的數量。 –

+0

要添加到Andy所說的內容中,我會計算字節中System.lineSeperator()字符串的數量,以便更加精確。它不應該引起問題,但使用'System.lineSeperator()'是一個好習慣。 –

回答

1

以下方法會做你想做的。

它統計每個字符,包括CRLF字符,在line緩衝區中建立一行文本。在每行的結尾,它檢查offsetNum是否在該行內,包括第一個字符和換行符,如果是,則返回行。否則它清除line緩衝區並繼續下一行。

請注意,如果offsetNumCRLF對的LF上,它將返回一個空行,這是不正確的,但我會讓你找出一個。

private static String readLineAtOffset(String fileName, int offsetNum) throws IOException { 
    int count = 0; 
    StringBuilder line = new StringBuilder(); 
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) { 
     for (int ch; (ch = reader.read()) != -1; count++) { 
      if (ch != '\r' && ch != '\n') 
       line.append((char)ch); 
      else if (count < offsetNum) 
       line.setLength(0); 
      else 
       break; 
     } 
    } 
    return (count >= offsetNum ? line.toString() : null); 
} 
+0

它完美的作品,謝謝! – user3147590

+0

如果我們需要LineNo,那麼如何? – user3147590

+0

添加另一個計數器並逐行遞增。 – Andreas

相關問題