【问题标题】:How to Start read a TextFile from Specific line using java如何使用java从特定行开始读取文本文件
【发布时间】:2019-01-14 07:44:51
【问题描述】:

我想从特定行开始读取 TextFile 我有一个这样的文本文件

        #11
        mango
        apple
        orange
        END
        #22
        dog
        cat
        monkey
        END
        #33
        car
        bus
        van
        END

这里我想得到 #22 和 END 之间的所有行

      String text = new String(Files.readAllBytes(Paths.get("mypath")), 
      StandardCharsets.UTF_8);
      //multiple lines to single line
      text=text.replaceAll("[\r\n]+", " "); 
      Pattern pattern = Pattern.compile("#22(.*?)END");
      Matcher matcher = pattern.matcher(text);
      while (matcher.find()) {
          System.out.println(matcher.group(1));
      }

它在一行中给出输出(狗猫钱)。如何从文件中仅获取以下行(逐行)

                dog
                cat
                monkey

我不确定特定数字(#22)之后是什么数字。例如,#33 是。任何仅使用 #22 和 END(在 #33 之前)的方法

【问题讨论】:

  • 您使用的是 java 8 或更低版本吗?
  • 我正在使用 java 8

标签: java regex string file


【解决方案1】:

要匹配最后一个 END,您需要使用 $ 锚点,例如 "#22(.*?)END$",这意味着文件结束,或者您可以删除 ?,您的正则表达式应该看起来像 "#22(.*)END"

你也提到了:

如何从文件中仅获取以下行(逐行)

你可以像这样使用Pattern.DOTALL

//text = text.replaceAll("[\r\n]+", " ");// no need to this 
Pattern pattern = Pattern.compile("#22(.*)END", Pattern.DOTALL);

这将返回:

    dog
    cat
    monkey
    END
    #33
    car
    bus
    van

编辑

我想要 #22 和 end(#33 之前)之间的文本

在此可以使用这个正则表达式#22((.*)#33(.*?))END

Pattern pattern = Pattern.compile("#22((.*)#33(.*?))END", Pattern.DOTALL);

编辑

有什么办法不直接给出#33。因为有数字 将不按顺序进行

您可以在这种情况下使用,其中数字可以由用户给出:

int number = 33;
String regex = String.format("#22((.*)#%d(.*?))END", number);
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);

【讨论】:

  • 感谢您的回复。但这需要 #22 之后的所有内容。这只是我在这里给出的一个例子。我的文本文件中有 5000 行
  • @priya 等等!你想走哪条线,你在#22和最后一个END之间提到了最后一个END之后还有其他数据吗?
  • 其实它不是最后一个结束..在 #33 之前结束
  • 我想要 #22 和 end(在 #33 之前)之间的文本
  • @priya 在这种情况下试试这个正则表达式而不是"#22((.*)#33(.*?))END"
【解决方案2】:

YCF_L 的答案给出了正确的结果,但是如果您有一个非常大的文件,即使您只使用其中的一小部分,它也会将整个内容读入内存。为了避免这种情况,并且一次处理一行,如果你有 Java 10,你可以这样做:

    try (Stream<String> lines = Files.lines(Paths.get("out/production/scratch/file.txt"))) {
        lines
                .dropWhile(line -> !line.equals("#22"))
                .skip(1)
                .takeWhile(line -> !line.equals("END"))
                .forEachOrdered(System.out::println);
    }

但是您声明您只有 Java 8,它缺少 dropWhiletakeWhile 方法。相反,您可以使用现有的 Java 7 方法:

    try (BufferedReader br = Files.newBufferedReader(Paths.get("out/production/scratch/file.txt"))) {
        String line;
        while ((line = br.readLine()) != null && !line.equals("#22"))
            ;  // skip lines
        while ((line = br.readLine()) != null && !line.equals("END"))
            System.out.println(line);
    }

请注意,在这两个示例中,都使用了 try-with-resources 语句,以便在您遇到“#22”之后的第一个“END”行时自动关闭文件。

【讨论】:

  • 不错的答案我怀疑用户希望在 #22 到 #33 之后的 END 之间获得所有信息,但这是我的一个很好的回答 uv
  • @YCF_L in this comment OP 说“我想要 #22 和 END 之间的文本(之前 #33)”。
  • 嗨@Klitos Kyriacou 是的,OP 在那之后说this comment 你从中得到了什么;)
猜你喜欢
  • 2017-04-11
  • 2016-12-18
  • 2017-09-13
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多