1

ファイルを読み取ろうとしています。ファイルの一部を読み取り、ファイルの最後に到達するまで一部をスキップしたいと考えています。これは私が持っているものですが、望ましい結果が得られません。アイデアは、すべての行を読んで、ファイルの終わりまで次の行に移動しない場合は「CH」または「CL」で始まるかどうかを確認し、基準に一致するすべての行を保存することです

 new BufferedReader (new FileReader ("c:\\demo5.properties\\"));
    while(( br.readLine()) != null ){
        if (br.readLine().startsWith("CH") ||  br.readLine().startsWith("CL")) {
        buf = new StringBuffer();
        buf.append( br.readLine());

        while (br.readLine()!= null && !br.readLine().startsWith("#") &&  !br.readLine().contains("claimID")){
            buf.append( br.readLine()).append( "\n" );
        }
         z = buf.toString();

         System.out.println(z);

        s3+= z;
    }
        br.readLine();

ファイル形式

 CH.field 
 CH.field
 CH.field
 CH.field
 CH.field
 #CH.field
 #CH.field
 #CH.field
 #CH.field
 *********
 **
 *********
 CL1.field
 CL1.field
 CL1.field
 CL1.field
 CL1.field
 *****************
#Result.CL1.field
#Result.CL1.field
#Result.CL1.field
Result.CL1.field
*********
CL4.field
CL4.field
CL4.field
#CL4.field
#CL4.field
#CL4.field
***********

   #Result.CL4
  #Result.CL4
  #Result.CL4
  #Result.CL
 Result.CL4
  CL5.field
 CL5.field
 CL5.field
 #CL5.field
 #CL5.field

出力

CH.fieldCH.field

CL1.field#Result.CL1.field
CL4.field
CL4.field

#CL4.フィールド

CL5.fieldCL5.field
4

4 に答える 4

1

このループを見てください:

while (br.readLine()!= null 
       && !br.readLine().startsWith("#")
       &&  !br.readLine().contains("CH.field.claimID")){
    buf.append( br.readLine()).append( "\n" );
}

あなたはreadLine() 4回電話しています。これは 4 つの異なる行を読み取ります。次のようなものが必要です。

String line;
while ((line = br.readLine()) != null &&
       !line.startsWith('#') &&
       !line.contains("CH.field.claimID")) {
    buf.append(line).append("\n");
}    

少なくとも、それがあなたの望みだと思います。説明が少しわかりにくいと思います。とにかく、それは各行を読み取り、ファイルの終わり、または「#」で始まる行、またはStringBuffer「CH.field.claimID」を含む行に到達すると停止します...しかし、その前のすべての行を含むを構築します点。

于 2013-03-19T15:22:13.710 に答える
0

あなたの質問から、「CH」または「CL」で始まるすべての行を保存し、残りを無視したいことがわかりました。

すべての br.readline 呼び出しは、そのファイル リーダー ポインターを次の行に移動しています。

フォーマットは私には奇妙に見えます。多分これを試してください:

    String input = "";
    buf = new StringBuffer();
    new BufferedReader (new FileReader ("c:\\demo\\TestIL_Cross_000005.properties\\"));

    // read in the line to "input" if it exists
    while((input = br.readLine()) != null ){
        // check for starting string match
        if (input.startsWith("CH") ||  input.startsWith("CL")) { 
            // append to whatever data struct here since it matches       
            buf.append(input + "\n");
           // print "input" here for testing
        }
    }
于 2013-03-19T15:34:50.250 に答える
0

readLine() を呼び出すと、'\n' で終わる 1 行が読み取られ、ファイル ポインタが次の行を指します (より正確には、'\n' の後の行を指します)。

例えば

readLine() の前:

filePointer --> これは最初の行です \n

----------------- これは 2 行目です \n

readLine() の後:

------------------これは最初の行です \n

filePointer --> これは 2 行目です \n

同じ行を参照していると考えて readLine() を複数回呼び出しています。あなたが間違っているところです。

于 2013-03-19T15:32:29.790 に答える
0

これは、コードで犯した非常に基本的な間違いです。readLine() メソッドによって返されたデータを String 変数に格納し、それを以降の操作に使用する必要があります。毎回 readLine() メソッドを呼び出しており、受信した文字列に対して操作を実行する必要があるため、新しいデータをフェッチするたびに以前のデータが失われます。

コードの修正版:

         new BufferedReader (new FileReader ("c:\\demo\\TestIL_Cross_000005.properties\\"));
     String line = null;

        while(( line= br.readLine()) != null ){
            if (line.startsWith("CH") ||  v.startsWith("CL")) {
            buf = new StringBuffer();
            buf.append(line);

            while (line!= null && !line.startsWith("#") &&  !line.contains("CH.field.claimID")){
                buf.append( line).append( "\n" );
            }
             z = buf.toString();

             System.out.println(z);

            s3+= z;
        }

}

ここでは、String 参照の readLine() メソッドからデータを収集し、さまざまなチェックを実行するために使用しています。

于 2013-03-19T15:35:31.050 に答える