已排序文件中的Java字符串匹配并对类似数据进行分组

时间:2014-08-19 19:26:11

标签: java regex file string-matching

我已经排序了文件,我需要进行以下模式匹配。我读取了行然后比较或者与它之后的行进行patern匹配,如果它匹配则插入我用来匹配的字符串后该行中的逗号并移动到下一行。我是Java的新手,并且从Open CSV到BufferedReader的选项不堪重负。我打算遍历文件直到它结束。我可能总是有空白,并且引用日期。文件大小约为100 MB。 我的文件包含

等数据
ABCD
ABCD123
ABCD456, 123 
XYZ
XYZ890
XYZ123, 890

,输出预计为

ABCD, ABCD
ABCD123, ABCD
ABCD456, 123, ABCD
XYZ, XYZ
XYZ890, XYZ
XYZ123, 890, XYZ

不确定最好的方法。你能帮我吗?

2 个答案:

答案 0 :(得分:3)

要打开文件,您可以使用File和FileReader类:

File csvFile = new File("file.csv");

FileReader fileReader = null;
try {
    fileReader = new FileReader(csvFile);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

您可以使用Scanner获取该文件的一行:

Scanner reader = new Scanner(fileReader);

while(reader.hasNext()){
    String line = reader.nextLine();
    parseLine(line);
}

您想要解析此行。为此,您必须学习Regex以使用Pattern和Matcher类:

private void parseLine(String line) {
    Matcher matcher = Pattern.compile("(ABCD)").matcher(line);
    if(matcher.find()){
        System.out.println("find: " + matcher.group());
    }
}

要查找同一行的下一个模式,可以重用matcher.find()。如果找到某些结果,它将返回true,您可以使用matcher.groud();

获得此结果

答案 1 :(得分:0)

逐行阅读并使用正则表达式根据您的需要使用String.replaceAll()

替换它
^([A-Z]+)([0-9]*)(, [0-9]+)?$

替换:$1$2$3, $1

这是Online demo

详细了解Java Pattern


示例代码:

String regex = "^([A-Z]+)([0-9]*)(, [0-9]+)?$";
String replacement = "$1$2$3, $1";

String newLine = line.replaceAll(regex,replacement);

为了获得更好的性能,请一次读取100行或更多行并存储在缓冲区中,最后一次调用String#replaceAll()一次替换所有行。

示例代码:

String regex = "([A-Z]+)([0-9]*)(, [0-9]+)?(\r?\n|$)";
String replacement = "$1$2$3, $1$4";

StringBuilder builder = new StringBuilder();
int counter = 0;
String line = null;
try (BufferedReader reader = new BufferedReader(new FileReader("abc.csv"))) {
    while ((line = reader.readLine()) != null) {
        builder.append(line).append(System.lineSeparator());
        if (counter++ % 100 == 0) { // 100 lines
            String newLine = builder.toString().replaceAll(regex, replacement);
            System.out.print(newLine);
            builder.setLength(0); // reset the buffer
        }
    }
}
if (builder.length() > 0) {
    String newLine = builder.toString().replaceAll(regex, replacement);
    System.out.print(newLine);
}

详细了解Java 7 - The try-with-resources Statement