【问题标题】:Java String Matching in a Sorted File and grouping similar data排序文件中的 Java 字符串匹配和对相似数据进行分组
【发布时间】:2014-10-13 00:40:49
【问题描述】:

我已经对文件进行了排序,我需要进行以下模式匹配。我读取了该行,然后与它之后的行进行比较或进行模式匹配,如果它匹配,则在该行中的逗号之后插入我用来匹配的字符串并移至下一行。我是 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

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

【问题讨论】:

  • 最简单的通常是最好的
  • 上述样本的预期输出是什么?
  • @user3218114 刚刚更新了预期结果。谢谢。

标签: java regex file string-matching


【解决方案1】:

要打开文件,您可以使用 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(); 得到这个结果;

【讨论】:

  • 谢谢,我想我也可以用字符串拆分来解析行,但是我如何遍历下一行直到我的模式中断并插入分组字符串的数据。我错过了什么吗?
  • 如果这个答案是正确的,你能把它标记为正确吗?
【解决方案2】:

逐行阅读并使用正则表达式根据您的需要使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多