1

次のような文字を含むファイルがあります。ABCD...HHCCCCHH..BC

Hここで、2 つの間のギャップHが 20 文字未満の場合、2 つの間の文字を削除したいと考えています。そして、出力を新しいファイルに書き込みます。したがって、新しいファイルは次のようになります。

ABCD...HH..BC

これは速い方法で行うことができますか?

4

3 に答える 3

2

ファイルがメモリに簡単に収まる場合は、Apache commons-io を使用できます。

String input = FileUtils.readFileToString(new File("inputFile"), "UTF-8");
Pattern p = Pattern.compile("H[^H]{1,19}H");
Matcher m = p.matcher(input);
String output = m.replaceAll("HH");
FileUtils.writeStringToFile(new File("outputFile"), output, "UTF-8");
于 2012-06-24T20:03:46.853 に答える
1

純粋なJavaコード

public static void main(String[] args) throws Exception {

    BufferedReader in=new BufferedReader(new FileReader("d:\\data1.txt"));
    StringBuilder sb=new StringBuilder();
    String line=null;
    while((line=in.readLine())!=null)
        sb.append(line);

    String alteredData=sb.toString().replaceAll("H.{1,19}H", "HH");

    BufferedWriter out=new BufferedWriter(new FileWriter("d:\\data2.txt"));
    out.write(alteredData);

    in.close();
    out.close();

}
于 2012-06-24T20:20:25.477 に答える
1

私はこれをジョン・ワッツの答えへのコメントとして残していたでしょうが、少し長すぎます...

バッファリングされた I/O は、Java が非常に効率的です。まともなパフォーマンスを得るために、ファイル全体をメモリにロードする必要はありません。行指向のファイルで、パターンが行の境界を越えていないと仮定すると、これで十分です。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

...

BufferedReader r = new BufferedReader(new FileReader(inputFile));
FileWriter w = new FileWriter(outFile);
String line;
Pattern p = Pattern.compile("HH.{1,19}HH");

while (((line = r.readLine()) != null)
{
    Matcher m = p.matcher(line);
    w.write(m.replaceAll("HHHH"));
    w.write('\n');
}

w.close();
r.close();

...
于 2012-06-24T20:30:07.410 に答える