【问题标题】:Trying to read this file in parts. read some part and skip some尝试分段读取此文件。阅读一些部分并跳过一些
【发布时间】:2013-03-19 15:17:48
【问题描述】:

我正在尝试读取文件,我想读取文件的某些部分并跳过某些部分,直到我到达文件末尾。这就是我所拥有的,但我没有得到我想要的结果。这个想法是通读所有行并检查它是否以“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.field

CL5.fieldCL5.field

【问题讨论】:

    标签: java


    【解决方案1】:

    看看这个循环:

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

    你打电话给readLine() 4 次。这将读取四个不同的行。你想要这样的东西:

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

    至少,我认为这就是您想要的 - 我发现描述有点混乱。无论如何,这将读取每一行,当它到达文件末尾时停止以“#”开头的行包含“CH.field.claimID”的行"... 但是建立一个 StringBuffer 包含该点之前的所有行。

    【讨论】:

      【解决方案2】:

      对 readLine() 的调用将读取以 '\n' 结尾的一行,然后文件指针将指向下一行(或者更准确地说,它将指向 '\n' 之后的任何内容)。

      例如

      在 readLine() 之前:

      filePointer --> 这是第一行 \n

      ----------------- 这是第二行\n

      readLine() 之后:

      -----------------这是第一行\n

      filePointer --> 这是第二行 \n

      您多次调用 readLine() 认为它指的是同一行。你哪里出错了。

      【讨论】:

        【解决方案3】:

        根据您的问题,我收集到您希望存储所有以“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
                }
            }
        

        【讨论】:

        • 我仍然想在验证它是否以 CH 或 CL 开头之后检查该行是否包含某些字符串,以及它是否跳过该行并移至下一行
        • 啊,我的错。好吧,我很高兴 Jon 能够为你解决这个问题。
        【解决方案4】:

        这是您在代码中犯的一个非常基本的错误。您必须将 readLine() 方法返回的数据存储在 String 变量中,并将其用于进一步的操作。每次都调用 readLine() 方法,想对接收到的 String 进行操作,结果每次获取新数据,之前的数据都丢失了。

        修改后的代码:

                 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() 方法收集数据,并用于执行不同的检查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-09
          • 1970-01-01
          相关资源
          最近更新 更多