【问题标题】:Java Scanner skip a row of dashesJava Scanner 跳过一行破折号
【发布时间】:2012-05-01 21:13:29
【问题描述】:

我有一个包含两列的文件,一列用于全名(名字和姓氏),另一列用于 ID 号。该文件还有一个带有“名称”和“ID”的标题,在标题下方和所有条目的上方,有一行由空格分隔的破折号。它看起来像这样:

NAME        ID
------      ------
John Snow   0001
Tyrion      0002

我希望能够跳过这行破折号,我一直在尝试使用Scanner.skip(),但无济于事。我已经在 while 循环中设置了一个正则表达式来分割列之间的空格,并设置了一个 if 语句来绕过列标题。

【问题讨论】:

    标签: java regex java.util.scanner


    【解决方案1】:

    您可以使用BufferedReader而不是扫描仪。它有一个 readLine() 方法,可以用来跳过那些破折号。

    BufferedReader reader = new BufferedReader(... your input here...);
    String s;
    while((s=reader.readLine())!=null) {
       if (s.startWith("--")
           continue;
       // do some stuffs
    
    }
    

    编辑: 如果你想确保这些行只包含你可以使用的破折号和空格:

    s.matches("[\\- ]+")
    

    仅当您的行包含破折号和空格时才会匹配

    【讨论】:

    • 对我来说同样的解决方案。相反,我会检查该行是否只包含无用的字符,所以我会确保不会丢失一些数据,例如“--Doe”。但是 BufferedReader 对我来说也更好:)
    • @guillaume-polet,BufferedReader 似乎比 Scanner 更好的原因是什么?
    • 我也想知道。稍后我将尝试它,因为我无法使用 skip() 或 useDelimiter()。它一直在读取虚线。
    • 我应该提到我在 Android 中这样做,将文件数据加载到 File 对象中并使用 Scanner 对象读取。
    • @Roberto 嗯,BufferedReader 更适合读取文本,主要是它使用内部缓冲区来访问底层流。在读取文件的情况下,性能提升非常显着,因此您应该真正使用 BufferedReader 而不是 Scanner
    【解决方案2】:

    如果前两行总是静态的,试试这个-

    reader.readLine(); //reads first line, Name ID and does nothing
    reader.readLine(); //reads second line, ---- ---- and does nothing
    //start scanning the data from now.
    while(!EOF){
    String line = reader.readLine();
    //process the data.
    }
    

    通过这种方式,您可以消除将每一行与“--”进行比较的开销。

    【讨论】:

    • 这就是我目前正在做的事情。它有效,但我觉得有点“肮脏”,哈哈。
    【解决方案3】:
    FileReader fileReader = new FileReader(//File with Exension);
    
    Scanner fileScan = new Scanner(fileReader);
    
    fileScan.useDelimiter("\\-")
    
    while(fileScan.hasNext()){
    
       //Store the contents without '-'
       fileScan.next();
    }
    

    希望对你有帮助

    【讨论】:

    • 我无法使用 skip() 或 useDelimiter()。它一直在读取虚线。我用过 "\\-" 和 "[\\- ]+" 无济于事。
    【解决方案4】:

    如果你已经在使用 Scanner,那么试试这个:

    String curLine;
    
    while (scan.hasNext()){
        curLine = scan.readLine();
        if(!curLine.startsWith("----") {
            .... //whatever code you have for lines that don't contain the dashes
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多