比较java中的两个csv文件,并对double进行近似匹配
我需要编写一个JUnit测试,它将比较两个相同格式的csv文件,并且只有当它们的绝对差异小于阈值时才会通过。 我需要字符串和double的精确匹配,它应该满足阈值标准 CSV格式: first.csv Name price-1 price-2 item1 5.12 6.12 item2 4.23 5.56 item3 11.2 12.23 second.csv Name price-1 price-2 item1 5.12 6.10 item2 4.20 5.50 item3 11.19 12.19 first.csv 名称价格-1价格-2 项目1 5.12 6.12 项目2 4.23 5.56 项目3 11.2 12.23 秒.csv 名称价格-1价格-2 项目1 5.12 6.10 项目2 4.20 5.50 项目3 11.19 12.19 现在让我们假设差异阈值为0.15。 因此,first.csv和second.csv中项目2的价格1之间的绝对差值为0.03 然后它将通过JUnit测试,如果差异阈值为0.02,则它将失败比较java中的两个csv文件,并对double进行近似匹配,java,csv,junit,Java,Csv,Junit,我需要编写一个JUnit测试,它将比较两个相同格式的csv文件,并且只有当它们的绝对差异小于阈值时才会通过。 我需要字符串和double的精确匹配,它应该满足阈值标准 CSV格式: first.csv Name price-1 price-2 item1 5.12 6.12 item2 4.23 5.56 item3 11.2 12.23 second.csv Name price-1 price-2
有什么好的解决方案吗?您在标签中列出了junit Junit的.equals(double,double,accurity)允许您指定它们与最后一个参数的接近程度 我只是读入这些值,然后在测试中调用每个值的.equals 还是有什么我不明白的问题 为了解析这些行,示例使用空格,但您说的是“CSV”(逗号分隔)。如果它们实际上是CSV,您可以使用以下内容:
String[] line = currentLine.split(",")
在每一行上。这将为您提供第[0]=“item1”、第[1]=“5.12”、第[2]=“6.12”行
然后尝试使用Double.parseDouble()解析第[1]行和第[2]行
顺便说一下,使用assertEquals,而不是assertTrue,更具体的assertEquals将在junit结果中显示您想要的值和作为错误的一部分得到的值
我还建议您传入可选字符串。测试线如下所示:
assertEquals("item "+file1.line[0]+" values do not match",
Double.parseDouble(file1.line[1]),
Double.parseDouble(file2.line[1]),
0.001)
还有一个问题,就是要确保每个文件读的是同一行——让它们正确配对。如果保证它们的顺序相同,则可以,但如果不是,则可能希望按名称字段散列第一个文件:
for(String line: file1.readNextLine())
file1hash.put(line.split(",")[0],line)
然后,在遍历第二个文件时,您可以轻松地执行以下操作:
for(String line2: file2.readNextLine()) {
String line1=file1hash.get(line2.split(",")[0])
确保第1行和第2行引用同一行。您在标记中列出了junit Junit的.equals(double,double,accurity)允许您指定它们与最后一个参数的接近程度 我只是读入这些值,然后在测试中调用每个值的.equals 还是有什么我不明白的问题 为了解析这些行,示例使用空格,但您说的是“CSV”(逗号分隔)。如果它们实际上是CSV,您可以使用以下内容:
String[] line = currentLine.split(",")
在每一行上。这将为您提供第[0]=“item1”、第[1]=“5.12”、第[2]=“6.12”行
然后尝试使用Double.parseDouble()解析第[1]行和第[2]行
顺便说一下,使用assertEquals,而不是assertTrue,更具体的assertEquals将在junit结果中显示您想要的值和作为错误的一部分得到的值
我还建议您传入可选字符串。测试线如下所示:
assertEquals("item "+file1.line[0]+" values do not match",
Double.parseDouble(file1.line[1]),
Double.parseDouble(file2.line[1]),
0.001)
还有一个问题,就是要确保每个文件读的是同一行——让它们正确配对。如果保证它们的顺序相同,则可以,但如果不是,则可能希望按名称字段散列第一个文件:
for(String line: file1.readNextLine())
file1hash.put(line.split(",")[0],line)
然后,在遍历第二个文件时,您可以轻松地执行以下操作:
for(String line2: file2.readNextLine()) {
String line1=file1hash.get(line2.split(",")[0])
要确保第1行和第2行引用的是同一行。当您将assertEquals与double一起使用时,可以传入阈值。这在junit中称为delta 或者你可以使用
assertTrue (Math.abs(val1 - val2) < threshold);
这会过去的
或
将assertEquals与double一起使用时,可以通过阈值。这在junit中称为delta 或者你可以使用
assertTrue (Math.abs(val1 - val2) < threshold);
这会过去的
或
看这个问题:看这个问题:你不应该在减去这两个值时取绝对值吗?@Danny ha:)-你在我编辑帖子时添加了这个评论。正确,我已将其更新为使用数学。abs@RNJ当我读取csv文件时,它会给出字符串数组。我是否必须显式检查它是否可以双精度解析。在我的实际文件中,有240列,其中一些是双精度和其他字符串。感谢您提供JUnit信息。我将使用double.parseDouble()并捕获NumberFormatException。如果抛出异常,则它不是双精度的,因此您无法对其进行比较。如果没有异常,则可以使用assertEquals@arpitMandliya我刚刚更新了help的答案,你不应该在减去这两个值时取绝对值吗?@Danny ha:)-你在我编辑这篇文章时添加了这条评论。正确,我已将其更新为使用数学。abs@RNJ当我读取csv文件时,它会给出字符串数组。我是否必须显式检查它是否可以双精度解析。在我的实际文件中,有240列,其中一些是双精度和其他字符串。感谢您提供JUnit信息。我将使用double.parseDouble()并捕获NumberFormatException。如果抛出异常,则它不是双精度的,因此您无法对其进行比较。如果没有异常,则可以使用assertEquals@arpitMandliya我刚刚更新了Help的答案,当我读取csv文件时,它给出了字符串数组。我必须同时检查column1(名称)的字符串等价性和double准确性(其他两列)。我必须显式检查它是否可分为double。在我的实际文件中,有240列,其中一些是双精度和其他字符串。当我读取csv文件时,它会给出字符串数组。我必须同时检查column1(名称)的字符串等效性和double准确性(其他两列)。我必须明确检查它是否可以双精度。在我的实际文件中,有240列,其中一些是双弦和其他弦。