Java Junit-比较两个CSV流是否相同

Java Junit-比较两个CSV流是否相同,java,csv,junit,Java,Csv,Junit,我得到了两个CSV流(一个输入流和一个输出流),我需要忽略标题和空白进行比较,以检查它们的内容是否相同。 有允许这样做的图书馆吗 我目前正在这样做: HashSet<String> f1 = new HashSet<String>(IOUtils.readLines(new ByteArrayInputStream(((ByteArrayOutputStream)outputStream).toByteArray()))); HashSet<String&

我得到了两个CSV流(一个输入流和一个输出流),我需要忽略标题和空白进行比较,以检查它们的内容是否相同。 有允许这样做的图书馆吗

我目前正在这样做:

HashSet<String>  f1 = new HashSet<String>(IOUtils.readLines(new ByteArrayInputStream(((ByteArrayOutputStream)outputStream).toByteArray())));
    HashSet<String> f2 = new HashSet<String>(IOUtils.readLines(expectedStream));
    f1.removeAll(f2); // f1 now contains only the lines which are not in f2
    Assert.assertTrue(f1.isEmpty());
HashSet f1=new HashSet(IOUtils.readLines(new ByteArrayInputStream(((ByteArrayOutputStream)outputStream).toByteArray());
HashSet f2=新的HashSet(IOUtils.readLines(expectedStream));
f1.移除所有(f2);//f1现在只包含不在f2中的行
Assert.assertTrue(f1.isEmpty());

<>但显然不是最好的,因为它不考虑顺序。 你可以改变的直截了当的事情:

  • 使用
    assertThat(actualSet,is(expectedSet))
    ——它只是按照应该比较的方式比较嵌套结构
  • 如果顺序对您很重要,那么您不应该使用哈希集,而应该使用跟踪插入顺序的LinkedHashSet
根据你的意见,你的要求。。。解决方案可能更像这样:

open file 1
open file 2

read one line (as String) from each file
  throw away the very first line
  for all others: use replaceAll to simply replace spaces with nothing
  compare the two lines
最后,;当两个文件的行数不同时,也会“失败”。这里唯一的警告;如果:

file1:
"value value", "B"

file2:
"value   value",    "B"

如果不相等(因为CSV“列数据”中有空格),则上述方法无效。然后,您需要一个CSV解析器来获取解析后的内容;您可以使用commons csv或其他csv库解析csv,然后比较行列表。这将允许您逐列比较行,还允许您补偿csv转义、不同分隔符等

如果您很乐意只使用string equals,那么您可以只使用上面所述的方法,但需要切换到LinkedHashSet来处理这些行。这将维持秩序。我不知道你为什么要用电视机;所以也许你应该用列表来代替。不管怎样,你都能维持秩序


然后,您可以使用Java8流对这两个集合进行一些处理和规范化(首先跳过、过滤空行、规范化行(尾随空格、换行符等)。然后,您可以在两个新列表中收集两条流,并进行深度相等,以断言它们是相同的。

我不太确定您的要求。您能给出一个“更完整”的答案吗?例如,我想知道outputStream和expectedStream是如何产生的?从这个意义上说:这个测试的目的是什么?测试一些生产代码,或者只是比较CSV文件的内容?我只需要比较两个流的内容。没有标题,也不考虑空格。请参阅我的更新。只添加了一条注释。你呢你建议再次解析内容吗?唉,我建议回到我的第一条评论。似乎到目前为止,我所尝试的并不是你所需要的。但我真的不知道你想要什么。正如所说的:给出一个真实的描述,描述输入,以及预期的输出/行为。如前所述:你说你关心顺序,但随后你傻笑了我很想使用哈希集;我不知道这一切会产生什么结果。这是我在StackOverflow上找到的一个解决方案。我得到了一个函数,它接收输入csv流,根据指定的字段对其进行排序,并在outputStream中返回结果。在这个测试中,我想将outputStream内容与内容进行比较一个正确排序的流的名称是相同的。这就是为什么我不需要关心头和空格的原因。我以这种方式分析了这两个流:List actualCSVRecords=CSVFormat.RFC4180.parse(actualCSVReader).getRecords();List expectedCSVRecords=CSVFormat.RFC4180.parse(expectedCSVReader).getRecords();但如果例如我断言actualCSVRecords.equals(expectedCSVRecords)我猜错了。正确的方法是什么?也许你可以提供一些数据示例,说明你在比较什么。我所知道的是你的测试已经告诉你的:它们是不同的。所以找出它们的不同之处,并尝试对此进行补偿。此外,列表相等可能没有做深入的相等。。。