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

时间:2017-01-04 10:15:30

标签: java csv junit

我有两个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());

但它显然不是最好的,因为它不考虑订单。

2 个答案:

答案 0 :(得分:0)

你可以改变的直接事情:

  • 使用assertThat(actualSet, is(expectedSet)) - 只是比较嵌套结构,因为它们应该进行比较
  • 如果订单对您很重要,那么您不应该使用 HashSet ,而应该使用 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解析器来获取已解析的内容;比较一下。

答案 1 :(得分:0)

您可以使用commons-csv或其他一些csv库来解析csv,然后比较行列表。这将允许您逐列比较行,并且还允许您补偿csv转义,不同的分隔符等。

如果您乐意只使用字符串等号,您可以执行上面所做的操作,但切换到行的LinkedHashSet。这将保留订单。我不确定你为什么要使用套装;所以也许你应该只使用一个列表。无论哪种方式,您都会保留订单。

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