2017-01-06 13 views
3

ファイルは改行で区切られていますが、改行で区切られていますが、いくつかのレコードに改行があります。私はそれぞれのレコードを取得し、それらを別々に処理する必要があります。このファイルのサイズは数MBです。Javaを使ってregexに基づいてファイルを分割する方法

FileInputStream fs = new FileInputStream(FILE_PATH_NAME); 
Scanner scanner = new Scanner(fs); 
scanner.useDelimiter(Pattern.compile("<\\?")); 
if (scanner.hasNext()) { 
    String line = scanner.next(); 
    System.out.println(line); 
} 
scanner.close(); 

しかし、私は初め< \を持って得た結果:

<?aaaaa> 
<?bbbb 
    bb> 
<?cccccc> 

私は、コードを持っていますか?削除:

aaaaa> 
bbbb 
    bb> 
cccccc> 

私は、スキャナは、区切り文字パターンに一致する入力を消費知っています。私が考えることができるのは、区切り文字のパターンを各レコードのmannullyに戻すことだけです。

区切りパターンを削除しない方法はありますか? ">"文字が先行するだけで改行上

答えて

5

ブレイク:

scanner.useDelimiter("(?<=>)\\R"); // Note you can pass a string directly 

\Rはシステムに依存しない改行
(?<=>)前の文字があること(消費せず)をアサート背後表情があります>

さらに、<=>Darth Vader's TIE fighterのように見えるので、クールです。

+0

(笑)だから、それがありません! – DevilsHnd

+0

私はそれをテストした、それは働いた!どうもありがとうございます! – jlp

+0

私はより多くのレコードでテストし、このアプローチは同じ行にいくつかのレコードを作成しました。あなたは助けてもらえますか? – jlp

1

どこでも改行文字「'\n'」を無視したいと思っています。

私はwhole file into a Stringを読んでからremove all of the '\n's in the Stringと読んでいます。この質問のコード部分は次のようになります。

String fileString = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8); 
fileString = fileString.replace("\n", ""); 
Scanner scanner = new Scanner(fileString); 
... //your code 

お気軽にご質問ください。ここで

+0

ファイルは数MBの大きさで、ファイル全体を文字列に格納すると問題が発生するかどうかは不明です。 – jlp

+0

@jlpファイルが数メガバイトのサイズであることは心配しませんが、このアプローチがうまくスケールされないことは間違いありません。 –

0

StringBuilderを使用することによって、それを行うための一つの方法です:

public static void main(String[] args) throws FileNotFoundException { 
    Scanner in = new Scanner(new File("C:\\test.txt")); 
    StringBuilder builder = new StringBuilder(); 

    String input = null; 
    while (in.hasNextLine() && null != (input = in.nextLine())) { 
     for (int x = 0; x < input.length(); x++) { 
      builder.append(input.charAt(x)); 
      if (input.charAt(x) == '>') { 
       System.out.println(builder.toString()); 
       builder = new StringBuilder(); 
      } 
     } 
    } 

    in.close(); 
} 

入力:

<?aaaaa> 
<?bbbb 
    bb> 
<?cccccc> 

出力:

<?aaaaa> 
<?bbbb  bb> 
<?cccccc> 
関連する問題