2

我试图在 .csv 文件的一行中找到一个正则表达式,因此我最终可以将所有匹配项保存到另一个文件中,并丢失所有其他垃圾。

所以我文件中的一行可能如下所示:MachineName,User,IP,VariableData,Location

VariableData 是我要匹配的内容,如果匹配,则打印该行。我为此使用了一个模式,因为我只想要 VariableData 的 10 个变体中的 3 个,并且在这 3 个变体中,它们的编号不同(例如,“pc104、pccrt102、pccart65”)。

我正在尝试使用 Scanner 类来做到这一点,并尽可能保持简单,以便我能理解它。这是我的目标......(模式不完整,只需像这样进行测试)。

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 类,但只找到了一种匹配表达式但没有得到整行的方法。

我的另一个想法可能是以某种方式计算包含模式的行,然后返回并打印与计数相对应的行。

4

3 回答 3

2

这是grep为之设计的,但如果你想用 Java 来做,那么你可以使用这个while循环体:

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

正如其他人所提到的,您的原始代码的问题在于它实际上并没有推进Scanner.

于 2010-03-20T18:18:39.053 回答
1

目前你只是询问扫描仪是否有另一个条目,而不是真正得到它(通过next()

于 2010-03-20T15:02:34.123 回答
1

关于为什么你永远循环的第一个猜测是 Scanner 类有两个方法:hasNextnext.

hasNext将测试是否有另一个匹配的令牌,而不移动Scanner文件中的 ' 位置。

next将返回下一个令牌,如果由于某种原因它不起作用,则抛出异常。

所以通常,你会看到这两个是这样使用的:

String token = "";
if(myScan.hasNext(wtv)) {
    token = myScan.next(wtv);
}
于 2010-03-20T15:02:54.963 回答