2015-10-03 56 views
3

我正在从csv文件读入。每一行都是一行中具有该对象字段的对象。每行的最后一个值恰好是一个双精度值。如果我用scan.nextDouble()读取它,我会得到一个inputMismatchException。我假设这是因为换行符。如果我以字符串的形式读取它并不会出现问题,那么我可以尝试将它解析为双精度型,但我想知道为什么线的末尾首先会导致错误。行尾扫描器错误

该文件本身是120000行,如果我跳过每个的最后一个值,只是调用nextLine()一切正常。当我尝试阅读最后两次时,我得到错误。任何帮助都会受到欢迎。我昨晚很晚才发布这个问题,但遇到过于忙于格式化我的示例并让我的代码满足一些Google代码要求的人。我玩弄了它,缩小了它的范围,试图将最后一个值作为无法运行的双精度值读取。

我用这个作为一个扫描器:

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”放入一个double。再一次,我认为它是扫描器不会将新行识别为分隔符

+0

你能提供你的线怎么看起来像一个简短的样本? – dxdy

回答

3

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

ABC,123,24.5 
DEF,456,29 

现在,当涉及到第三个令牌,它会采取24.5\nDEF是你的下一个标记,然后它会尝试解析为双当然,日是行不通的。

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

  1. 读通过nextLine()线线,劈在逗号行了,然后分析每个令牌。
  2. 允许定界符是任一逗号或结束行:

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

    这告诉如果看到逗号或一个在线分离器,该扫描器(可选\r为窗口式行分隔符),那么它就是令牌的结尾。

+0

这工作,现在我在阅读46行后得到inputmismatchexception。即使我在文件的其他位置启动,总是有46行。 – user3255982

+0

什么是第46行? – pelumi

+0

0.00885,-3.306323,,7.91,0.281,K2,1.104,335.01103,0.776192,-19.353759,0.00000146,0.00001806,0.00002605如果我抛出25下一行(),它开始正确读取,但随后25 + 46行我得到同样的例外。 – user3255982

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

如果文件来自具有不同行分隔符设置的不同机器,该怎么办? – Tom