当前位置: 首页 > 知识库问答 >
问题:

Java8流过滤CSV中的行,但保留第一行[重复]

凤高翰
2023-03-14

我想从CSV文件中删除包含错误日期的行。在这个过程中,CSV文件应该保留头行。所有这些我都希望使用Java8 Streams来执行。

一开始我想到了这个:

try (Stream<String> linesUnfiltered = Files.lines(f.toPath(), StandardCharsets.UTF_8)) {
    Stream<String> firstLine = linesUnfiltered.limit(1);
    Stream<String> linesFiltered = linesUnfiltered
            .filter(e -> e.contains(sdfFileContent.format(fileDate)));
    Stream<String> result = Stream.concat(firstLine, linesFiltered);
    Files.write(f.toPath(), (Iterable<String>) result::iterator);
}

共有1个答案

解晟
2023-03-14

您可以使用读取器并调用readline方法来使用标头,然后对lines()的结果进行筛选(在使用同一读取器的第一行之后):

try (BufferedReader reader = Files.newBufferedReader(f.toPath(), 
                                  StandardCharsets.UTF_8)) {

    Stream<String> firstLine = Stream.of(reader.readLine());
    Stream<String> linesFiltered = reader.lines()
            .filter(e -> e.contains(sdfFileContent.format(fileDate)));
    Stream<String> result = Stream.concat(firstLine, linesFiltered);

    ...
 类似资料:
  • 问题内容: 我犯了一个错误,并且有多余的重复项。 我有一个包含4个关键字段的表。,,,。 是自动递增和主键。 的组合,而应该是唯一的,我有我之前创建唯一索引来删除重复的行。有些行有一个重复项,有些行有很多重复项。 向我显示了我需要处理的重复值。但是现在我不知道如何保留一个并删除每个重复集的其余部分。 问题答案: 备份数据,然后… MySQL在DELETE语句中支持JOIN。如果要保留第一个重复项:

  • 我有一个简单的数据库表 我想删除所有按fv和sv分组的重复行。这已经是一个相当流行的问题,有很好的答案。但我需要改变这种情况。当rel\u id为NULL时,我想保留该行。在任何其他情况下,任何事情都会发生。 所以通过使用以下值 任何一个 或 将是有效的结果。其中为 不会。因为第一个条目有作为,它在之上担任主席。 我目前有这个(这是关于基本重复问题的答案)作为删除重复项的查询,但我不确定如何继续修

  • 在下面的代码中,如何避免处理的第一行? file1.csv是: 而file2.csv是: 我试图减去人和他/她的宠物的年龄,如果它出现在两个CSV中,但我得到以下错误,因为它也处理第一行:

  • 问题内容: 我在弄清楚如何跳过csv文件中的n行但保留标题为1行时遇到了麻烦。 我想做的是迭代但保留第一行的标题。 将标题设置为跳过的行之后的第一行。最好的方法是什么? 问题答案: 您可以将行号列表传递给而不是整数。 通过给该函数提供整数10,您只需跳过前10行。 要保留第一行0(作为标题),然后将其他所有内容都跳过到第10行,您可以编写: 其他跳过行的方法 控制哪些行使用的两种主要方法是或参数。

  • 问题内容: 由于mapper函数在每一行上运行,我可以知道如何跳过第一行。对于某些文件,它包含我想忽略的列标题 问题答案: 在读取文件的映射器中,数据作为键值对读取。关键是下一行开始处的字节偏移量。对于第1行,它始终为零。所以在mapper函数中执行以下操作

  • 有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。 到目前为止,这