行尾的扫描仪错误

时间:2015-10-03 20:30:43

标签: java

我正在从csv文件中读取。每一行都是一个对象,该对象的字段在一行上。每一行的最后一个值恰好是一个双精度值。如果我用scan.nextDouble()读取它,我会得到一个inputMismatchException。我假设它是因为换行符。如果我以字符串形式读取它没有问题,那么我可以尝试将其解析为double,但我想知道为什么行的结尾会导致错误。

文件本身长120000行,如果我跳过每个文件的最后一个值,只需调用nextLine()一切正常。当我尝试读取最后一个双倍时我得到错误。任何帮助都会被贬低。我昨晚很晚才发布这个问题,但遇到的人太过专注于格式化我的样本并让我的代码满足一些谷歌代码要求。我玩了它,并缩小它以试图读取最后一个值作为双重无效。

我正在使用它作为扫描仪:

Scanner scan = new Scanner(new BufferedReader(new FileReader("file.csv")));
scan.useDelimiter(",");

它忽略了逗号就好了,我试过让换行符也是一个分隔符,但它崩溃得厉害。

文件中的3行:

0,0,Sol,-26.7,4.85,G2V,0.656,0.000005,0,0,0,0,0
0.00006,1.089009,,9.1,2.39,F5,0.482,219.740502,0.003449,4.177065,0.00000004,-0.00000554,-0.000002
0.000283,-19.49884,,9.27,5.866,K3V,0.999,45.210918,0.003365,-16.008996,-0.00000007,0.00004213,-0.0000002

第一行的字段数正确。 我认为也许这些值太大了以至于无法适应,但我试图将字符串转换为double并且刚刚意识到它正试图将“0 \ n 0.00006转换成双倍。再次,我认为它是换行符没有被扫描仪识别为分隔符。

2 个答案:

答案 0 :(得分:3)

实际上,仅使用逗号分隔符是行不通的。 Scanner通过读入所有传入数据直到下一次出现分隔符为止。假设这是你的文件:

ABC,123,24.5
DEF,456,29

现在,当谈到第三个令牌时,24.5\nDEF将成为您的下一个令牌。然后它会尝试将其解析为double。当然,这不会奏效。

所以,你可以做以下两件事之一:

  1. 使用nextLine()逐行阅读,在逗号上拆分行,然后解析每个令牌。
  2. 允许分隔符为逗号或行尾:

    scan.useDelimiter(",|\r?\n");
    

    这告诉扫描程序,如果它看到逗号或行分隔符(可选\r用于windows样式的行分隔符),那么它就是令牌的结尾。

答案 1 :(得分:0)

scan.useDelimiter(",|" + System.getProperty("line separator"));