簡體   English   中英

Java 在文本中搜索並在文本周圍返回多行

[英]Java search in a text and returning multiple lines around it

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM