Распечатать строку, которая содержит определенный шаблон в Java - PullRequest
2 голосов
/ 20 марта 2010

Я пытаюсь найти регулярное выражение в строке файла .csv, чтобы в итоге я смог сохранить все совпадения в другой файл и потерять все остальные ненужные файлы.

Так что строка в моем файле может выглядеть так: MachineName, пользователь, IP, VariableData, расположение

VariableData - это то, что я хочу сопоставить, и, если есть совпадение, выведите строку. Я использую шаблон для этого, потому что я хочу только 3 из 10 вариантов VariableData, и из этих 3 они нумеруются по-разному (например, «pc104, pccrt102, pccart65»).

Я пытаюсь сделать это, используя класс сканера, и стараюсь сделать его максимально простым, чтобы я мог его понять. Вот куда я направлялся с этим ... (шаблон не завершен, просто используйте его для тестирования).

import java.io.File;
import java.util.Scanner;
import java.util.regex.Pattern;


public class pcv {

public static void main(String[] args) {

    File myFile = new File("c:\\temp\\report.csv");

    Pattern myPat = Pattern.compile("pc");

    try{
    Scanner myScan = new Scanner(myFile);

    while(myScan.hasNext()){

        if(myScan.hasNext(myPat)){
            System.out.println("Test");
        }

    }

    }catch(Exception e){

    }


}

}

Этот код повторяется, я предполагаю, что методы .hasNext () сбрасывают сами себя. Я немного поигрался с классом Matcher, но нашел только способ сопоставить выражение, но не получить всю строку.

Моей другой мыслью было, может быть, каким-то образом сосчитать строку, содержащую шаблон, а затем вернуться назад и напечатать строку, соответствующую подсчетам.

Ответы [ 3 ]

2 голосов
/ 20 марта 2010

Это то, для чего grep предназначен, но если вы хотите сделать это на Java, вы можете использовать вместо этого while тело цикла:

while(myScan.hasNext()){
   String line = myScan.nextLine();
   if (myPat.matcher(line).find()) {
      System.out.println(line);
   }
}

Как уже упоминалось, проблема с вашим исходным кодом в том, что он на самом деле не продвигает Scanner.

1 голос
/ 20 марта 2010

Первое предположение о том, почему вы зацикливаетесь навсегда, состоит в том, что класс Scanner имеет два метода: hasNext и next.

hasNext проверит, есть ли другой токен, который соответствует, без перемещения позиции Scanner в файле.

next вернет следующий токен и сгенерирует исключение, если по какой-то причине он не работает.

Итак, обычно вы увидите, что два используются следующим образом:

String token = "";
if(myScan.hasNext(wtv)) {
    token = myScan.next(wtv);
}
1 голос
/ 20 марта 2010

В данный момент вы только спрашиваете сканер, есть ли у него другая запись, а фактически не получает его (через next())

...