2015-06-08 48 views
1

我有一個文件,其中包含帶註釋的標題(例如[Comment]這是一個註釋)和後續的數據部分。數據從「Mk1 =」開始。在Java中使用Reg Exp處理文本文件的策略

程序我的工作應該:

  • 複製標題內容
  • 搜索並僅在文件
  • 寫頭和數據的數據部分替換爲新的文件

我目前使用的是:

  • 的StringBuffer
  • 掃描器
  • regex.Pattern;

在我的代碼到目前爲止(減少其要領):

public static void main(String[] args) { 

    File file = readFile("file.ext"); 

    Scanner inputScanner = null; 

    try { 
     inputScanner = new Scanner(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    String currentLine = ""; 

    while(inputScanner.hasNext()) { 
     currentLine = inputScanner.findInLine(regexpPattern); 

     if (currentLine != null){ 
      fileOutput.append(currentLine + "\n"); 
     } 
    } 

}

,因爲掃描儀的工作原理就像一個隊列,我有麻煩搞清楚我應該用什麼樣的策略。我找到了使用Matcher而不是Scanner的例子。據我的理解,我也必須使用布爾標誌,因爲掃描器的隊列結構。 findInHorizo​​n()方法似乎並不有用,因爲我希望reg exp僅適用於超出地平線的範圍。假設我知道標題開始和結束的一系列字符,是否有可能是掃描器分隔符的「黑客」?

文件示例

[Comment] 
Text goes here. 

[Another Comment] 
;Instructions: Below you will find Mk1= where the data can be assigned. 
;More text. 

Mk1=data 
Mk2=data 
Mk3=data 

我應該使用什麼策略?

回答

1

假設你可以使用java.nio.file.Files(自從Java 1.7)和文本文件不是太大,我會一次讀取的所有行,去匹配器:

Charset charset = Charset.forName("UTF-8"); 
List<String> lines = Files.readAllLines(file.toPath(), charset); 

for (String line : lines) { 
    Matcher matcher = regexpPattern.matcher(line); 

    if (matcher.matches()) { 
     // do something 
    } 
} 

使用正則表達式組將證明檢索參數值對有用:

Pattern dataPattern = Pattern.compile("^Mk(\\d+)=(.*)$"); 
Matcher dataMatcher = dataPattern.matcher(line); 
int mk = Integer.parseInt(dataMatcher.group(1)); 
String data = dataMatcher.group(2); 
+0

這看起來很有希望。這些文件大約是31 kB。在每個文件之後關閉InputStream足夠了嗎? – noumenal

+1

@noumenal我肯定會考慮31 kB的小文件。無需打開或關閉任何文件流,即使出現錯誤,Files.readAllLines()方法也可以處理文件的打開和關閉,這是一種非常高級的方法,適用於您的任務。它可能會在找不到文件時拋出一個'IOException'。 –

1

解析爲兩個步驟:你必須能夠識別輸入模式的分詞器和解析器讀取的標記,但也有一個狀態,知道它在哪裏。

您可以將regexp用於問題的「標記化」部分,但是您還需要一個解析器,該解析器記住「我看過[Comment]」,因此它知道接下來會發生什麼。

相關:

+0

感謝您的有用鏈接。恐怕我現在沒有18個小時來從事這種材料。有什麼特別的講座可以解決當前的問題嗎?在理想情況下,我會有一個解析器,它將數據部分的字符串和逐行解析器作爲頭部讀取。我認爲這將是最優化的解決方案。 – noumenal

+1

你並不需要一切;我建議先做第3部分,然後再做第5章的前兩部分。當你不瞭解這些視頻中的某些內容時,請觀看其餘部分。 –