从文件中删除重复项

时间:2015-02-24 16:32:36

标签: java text-parsing

我有一个文本文件。我想制作一组4行并检查这4行是否是唯一的。如果它们是唯一的,则将其复制到另一个文本文件中。

file.txt包含:

abc
12:12:11
john
12/25/2014
abc
12:12:11
doe
12/25/2014
abc
12:12:11
john
12/25/2014

新的txt文件应该只显示。

abc
12:12:11
john
12/25/2014
abc
12:12:11
doe
12/25/2014

and delete
abc
12:12:11
john
12/25/2014

有没有办法在Java中这样做?我无法弄清楚如何使用LinkedHashSet来获得结果。

3 个答案:

答案 0 :(得分:1)

因为你真正拥有的是两行而不是一行,所以事情比简单地逐行读取并且只修剪重复更复杂。

以下是使用Java 7的解决方案:

public static void eliminateDups(final String srcfile, final String dstfile)
    throws IOException
{
    final StringBuilder sb = new StringBuilder();
    final Set<String> seen = new HashSet<>();
    final Charset charset = StandardCharsets.UTF_8;

    final Path src = Paths.get(srcfile);
    final Path dst = Paths.get(dstfile);

    try (
        final BufferedReader reader = Files.newBufferedReader(src, charset);
        final BufferedWriter writer = Files.newBufferedWriter(dst, charset,
            StandardOpenOption.TRUNCATE_EXISTING);
    ) {
        String line1, line2;
        while ((line1 = reader.readLine()) != null) {
            line2 = reader.readLine();
            sb.setLength(0);
            if (!seen.add(sb.append(line1).append(line2).toString()))
                continue;
            writer.write(line1);
            writer.newLine();
            writer.write(line2);
            writer.newLine();
        }
    }
}

对于Java 6,我建议您使用Guava及其Closer来管理您的I / O资源。

答案 1 :(得分:0)

取决于日期是否始终保证相同:

  • 如果是,则将所有行添加到LinkedHashSet中作为复合值
  • 如果不是,则可能使用Map从值映射到日期。

答案 2 :(得分:-1)

只需将每行放入Set中,然后将该内容写入文件即可。 (是的LinkedHashSet实现以保留顺序)