Java 搜索文本并返回文本周围的多行

标签 java arrays string java.util.scanner

我正在一个更大的 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 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 行打印到控制台,包括匹配的行。

关于Java 搜索文本并返回文本周围的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64048731/

相关文章:

java - 如何使用 maven 或 pom.xml 更新属性文件

可以在运行时将字符串分配给 char*

c# - 将 float 转换为 double 会丢失精度但不会通过 ToString

java - JNI 字符串和 C 字符串

java - 计时器在指定时间后继续

python - Numpy 点积结果为 `IndexError: only integers, slices...`

arrays - 从数组的所有元素中删除空格

jQuery 将字符串转换为对象而不使用 eval()

java - Calendar.getTime() 失败,出现 java.lang.IllegalArgumentException :MINUTE for Asia/Singapore timezone

PHP 将多个数组中的数组值操作为单个数组