【问题标题】:Java search in a text and returning multiple lines around itJava 在文本中搜索并在其周围返回多行
【发布时间】:2021-01-10 21:08:56
【问题描述】:

我正在一个更大的 txt 文件 (~8Mb) 中搜索,其中每一行如下所示: dd/mm/yyyy hh:mm:ss 在这些之后有不同的标识符,然后是一个值。

dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier value -> value that I am searching for
dd/mm/yyyy  hh:mm:ss identifier not relevant in search
dd/mm/yyyy  hh:mm:ss identifier not relevant in search

我已成功找到并打印出包含我正在搜索的值的整行,但我需要在其他行中打印它周围的值(9 行之后,5 行之前)。

    public void fajl(String fajlnev, String szeriaszam) throws FileNotFoundException{
    int sorszam = 0;
    Scanner serialnummer = new Scanner(new File(fajlnev));
    while(serialnummer.hasNext()){ //keresés pörgetése
        String line = serialnummer.nextLine().toString();
        sorszam++;
        if(line.contains(szeriaszam)){
            System.out.println(line + "\n" + sorszam);

搜索和打印是这样的。如您所见,我也可以告诉行号,但我不知道如何打印出其他行。我正在考虑上传一个数组或类似的东西,但不知道从哪里开始。

【问题讨论】:

    标签: java arrays string java.util.scanner


    【解决方案1】:

    您可以使用队列(例如 Java LinkedList)在要匹配的行周围存储前 9 行和后 5 行。然后,打印出链表中的所有行。

    public void fajl(String fajlnev, String szeriaszam) throws FileNotFoundException {
        List<String> lines = new LinkedList<>();
        Scanner serialnummer = new Scanner(new File(fajlnev));
        int counter = 5;
        boolean flag = false;
    
        while (serialnummer.hasNext()) {
            String line = serialnummer.nextLine().toString();
            if (lines.size() >= 9 && !flag) {
                lines.removeFirst();
            }
            lines.add(line);
            if (line.contains(szeriaszam) && !flag) {
                flag = true;
            }
            else if (flag && --counter == 0) {
                break;
            }
        }
    
        for (String line : lines) {
            System.out.println(line);
        }
    }
    

    这里的逻辑是我们开始读取所有行并将其存储到一个链表中。一旦列表大小达到 9,并且如果发生在我们找到匹配行之前,我们会踢掉最旧的行,为最新的传入行腾出空间。一旦我们找到匹配的行,我们也添加它,然后再添加 5 行,倒计时。在方法结束时,我们将包括匹配行在内的 15 行打印到控制台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2018-05-05
      • 2013-01-03
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多