【问题标题】:Reading file using Files.lines(Paths.get(file1)) also read blank rows. How to erase blank rows?使用 Files.lines(Paths.get(file1)) 读取文件也会读取空白行。如何擦除空白行?
【发布时间】:2018-04-22 16:02:51
【问题描述】:

我有一个包含 2 行的 csv 文件。我用过

String file1  ="C:\\sample.csv";
Stream<String> lines = Files.lines(Paths.get(file1)) { 

读取文件中的行,但看起来它也将第 3 行读取为 ,,,,,, 第三行是空白的。有没有办法删除空白行?

【问题讨论】:

  • 我在文件中填充了 2 行。当我遍历文件中的行时,它应该在 2 行后停止。但它继续,因为从第 3 行开始它是 ,,,,,, 并且第 4 行是 ,,,,, 等等

标签: lambda java-8 stream java-stream


【解决方案1】:

以下将忽略所有空行:

Stream<String> lines = Files.lines(Paths.get(file1)).filter(s -> !s.isEmpty());

在您的情况下,如果您想忽略所有带有“,,,,,”的行,您可以执行以下操作:

Stream<String> lines = Files.lines(Paths.get(file1)).filter(s -> !s.equals(",,,,,,"));

或者,您可以忽略两者:

Stream<String> lines = Files.lines(Paths.get(file1)).filter(s -> !s.equals(",,,,,,") && !s.isEmpty());

【讨论】:

  • 你可以用s.equals("")代替s.isEmpty()
【解决方案2】:

由于您的 CSV 文件中只有 2 行您感兴趣并且您不希望包含第 3 行,因此您可以使用 limit 操作将这些行截断为 2

Stream<String> stream = Files.lines(Paths.get(file1)).limit(2)

更新:

您似乎事先不知道要检索的行数,因此无法使用上述解决方案,在这种情况下,如果您说“空白”是指具有“,,,,,”的行,那么从 Java-9 开始,您可以使用 takeWhile:

Stream<String> stream = Files.lines(Paths.get(file1))
                             .takeWhile(s -> !s.equals(",,,,,,"))

或者如果逗号的数量可能不同,那么您可以这样做:

Stream<String> stream = Files.lines(Paths.get(file1))
                             .takeWhile(s -> !s.startsWith(","))

否则,如果你说空白是指,那么你可以这样做:

Stream<String> stream = Files.lines(Paths.get(file1))
                             .takeWhile(s -> !s.trim().isEmpty())

但是,如果您因任何原因无法使用 JDK-9,则一旦发现空行就无法停止,相反,您需要像这样filter 他们:

Stream<String> stream = Files.lines(Paths.get(file1))
                             .filer(s -> !s.trim().isEmpty())

或:

Stream<String> stream = Files.lines(Paths.get(file1))
                             .filter(s -> !s.equals(",,,,,,"))

或:

Stream<String> stream = Files.lines(Paths.get(file1))
                             .filter(s -> !s.startsWith(","))

取决于空白行对你意味着什么。

【讨论】:

  • 但是我可以硬编码这个限制。可以填充任意数量的行。当没有行时,我的循环需要停止。
  • @Neha 当您说“空白”时,您是指空行还是包含“,,,,,,”的行,如果是后者,那么过滤掉行就足够了以“,”开头的?
【解决方案3】:
Files.lines(Paths.get(path))//Stream<String>
                .map(Optional::ofNullable) //Stream<Optional<String>>
                .flatMap(Optional::stream) //Stream<String>
                .forEach(System.out::println);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多