Java 行尾扫描仪错误
我正在从csv文件中读取。每一行都是一个对象,该对象的字段在一行上。每行的最后一个值恰好是一个双精度值。如果我用scan.nextDouble()读取它,我会得到一个inputMismatchException。我想这是因为新行的角色。如果我把它作为一个字符串读入,它就可以正常工作,然后我可以尝试将它解析为double,但我想知道为什么行尾首先会导致错误 文件本身有120000行长,如果我跳过每行的最后一个值,只调用nextLine(),一切正常。当我试着读入最后的两遍时,我会出错。任何帮助都会得到报答。我昨晚很晚才发布了这个问题,但是遇到了一些人,他们太专注于格式化我的样本,让我的代码满足一些谷歌代码的要求。我对它进行了处理,并缩小了范围,试图将最后一个值作为不起作用的双精度值来读取 我将此用作扫描仪:Java 行尾扫描仪错误,java,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
0,0,溶胶-26.7,4.85,G2V,0.656,0.000005,0,0,0,0,0,0
0.00006,1.089009,9.1,2.39,F5,0.482219.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.0000000 7,0.00004213,-0.0000002
第一行的字段数正确。
我认为这些值可能太大了,无法拟合,但我尝试将字符串转换为double,并且刚刚意识到它试图将“0\n将0.00006转换为双精度。再一次,我认为是新行没有被扫描器识别为分隔符 事实上,仅使用逗号作为分隔符是行不通的<代码>扫描仪的工作原理是读取所有传入数据,直到下一次出现分隔符。假设这是您的文件:
ABC,123,24.5
DEF,456,29
现在,当涉及到第三个令牌时,需要24.5\nDEF
作为下一个令牌。然后它将尝试将其解析为一个double。当然,这行不通
因此,您可以做以下两件事之一:
nextLine()
逐行读取,在逗号上拆分该行,然后解析每个标记scan.useDelimiter(",|\r?\n");
这告诉扫描程序,如果它看到逗号或行分隔符(可选的\r
用于windows样式的行分隔符),则它是标记的结尾scan.useDelimiter(“,|”+System.getProperty(“行分隔符”);
您能否提供一个简短的示例,说明您的行是什么样子的?这是有效的,现在我在阅读了46行之后得到了一个inputmismatchexception。始终是46行,即使我从文件的其他地方开始。0.00885,-3.306323,-7.91,0.281,K2,1.104335.01103,0.776192,-19.353759,0.00000146,0.00001806,0.00002605如果我输入25个nextLine()s,它开始正确读取,但是25+46行之后,我得到了同样的例外,这里有两个连续的逗号。如果您的文件是真正的CSV,这意味着它们之间有一个空标记,因此nextDouble
无法读取该文件。所以你可能想先测试一下这个案例。例如,检查hasNextDouble()
是否为false,即使hasNext()
为true。如果文件来自具有不同行分隔符设置的不同计算机,该怎么办?