比较java中的两个csv文件,并对double进行近似匹配

比较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测试,它将比较两个相同格式的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,则它将失败


有什么好的解决方案吗?

您在标签中列出了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列,其中一些是双弦和其他弦。