Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 行尾扫描仪错误_Java - Fatal编程技术网

Java 行尾扫描仪错误

Java 行尾扫描仪错误,java,Java,我正在从csv文件中读取。每一行都是一个对象,该对象的字段在一行上。每行的最后一个值恰好是一个双精度值。如果我用scan.nextDouble()读取它,我会得到一个inputMismatchException。我想这是因为新行的角色。如果我把它作为一个字符串读入,它就可以正常工作,然后我可以尝试将它解析为double,但我想知道为什么行尾首先会导致错误 文件本身有120000行长,如果我跳过每行的最后一个值,只调用nextLine(),一切正常。当我试着读入最后的两遍时,我会出错。任何帮助都会

我正在从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。如果文件来自具有不同行分隔符设置的不同计算机,该怎么办?