簡體   English   中英

Junit-比較兩個CSV流是否相同

[英]Junit - Comparing that two CSV streams are identical

我得到了兩個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());

但這顯然不是最好的,因為它不考慮順序。

可以直接更改的內容:

  • 使用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解析器來獲取解析后的內容。 比較一下。

您可以使用commons-csv或其他一些csv庫來解析csv,然后比較行列表。 這樣一來,您可以逐列比較行,還可以補償csv轉義,不同的分隔符等。

如果您樂於僅執行字符串等於,則可以執行上面的操作,但切換到LinkedHashSet行。 這將保留訂單。 我不確定您為什么要使用電視機。 所以也許您應該只使用一個列表。 無論哪種方式,您都將保留訂單。

然后,您可以使用Java 8流對這兩個集合進行一些處理和規范化(首先跳過,過濾空行,對行進行規范化(跟蹤空白,換行等),然后可以將這兩個流都收集在兩個新列表中並進行深入等於斷言它們是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM