次のような文字を含むファイルがあります。ABCD...HHCCCCHH..BC
H
ここで、2 つの間のギャップH
が 20 文字未満の場合、2 つの間の文字を削除したいと考えています。そして、出力を新しいファイルに書き込みます。したがって、新しいファイルは次のようになります。
ABCD...HH..BC
これは速い方法で行うことができますか?
次のような文字を含むファイルがあります。ABCD...HHCCCCHH..BC
H
ここで、2 つの間のギャップH
が 20 文字未満の場合、2 つの間の文字を削除したいと考えています。そして、出力を新しいファイルに書き込みます。したがって、新しいファイルは次のようになります。
ABCD...HH..BC
これは速い方法で行うことができますか?
ファイルがメモリに簡単に収まる場合は、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");
純粋な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();
}
私はこれをジョン・ワッツの答えへのコメントとして残していたでしょうが、少し長すぎます...
バッファリングされた 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();
...