1

我有一个包含如下字符的文件:ABCD...HHCCCCHH..BC

H现在,如果两个字符之间的间隔H小于 20 个字符,我想删除两个字符之间的字符。并将输出写入一个新文件。因此,新文件将如下所示:

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

我会将此作为对 John Watts 回答的评论,但它有点太长了......

缓冲 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 回答