2

.csv ファイルの行内で正規表現を見つけようとしているので、最終的にすべての一致を別のファイルに保存し、他のジャンクをすべて失うことができます。

したがって、私のファイルの行は次のようになります: MachineName,User,IP,VariableData,Location

一致させたいのは VariableData です。一致する場合は、その行を出力します。VariableData のバリエーションの 10 のうち 3 つだけが必要であり、それらの 3 つのうち、異なる番号が付けられているため (たとえば、「pc104、pccrt102、pccart65」)、これにパターンを使用しています。

Scanner Class を使用してこれを実行し、理解できるようにできるだけシンプルにしようとしています。これが私がこれに向かっていたところです...(パターンは完全ではありません。テストのためにこのようにしてください)。

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 クラスに と の 2 つのメソッドがあることhasNextですnext

hasNextScannerファイル内の の位置を移動せずに、一致する別のトークンがあるかどうかをテストします。

next次のトークンを返し、何らかの理由で機能しない場合は例外をスローします。

通常、この 2 つは次のように使用されます。

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