2017-01-04 72 views
0

2つのCSVストリーム(InputとOutputの1つ)があり、その内容が同一であることを確認するためにヘッダと空白を無視して比較する必要があります。 これを行うライブラリがありますか?Junit - 2つの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()); 

をしかし、それは順序を考慮していないとして、それは明らかに最善ではありません。あなたが変更することができます

+0

私は、あなたが求めているものは正確にはわかりません。「もっと完全な」[mcve]を与えることができますか?outputStreamとexpectedStreamがどのように来るかの例を考えていますか?このテストの目的は何ですか?プロダクションコードをテストするか、CSVファイルの内容を比較するだけですか? – GhostCat

+0

2つのストリームの内容を比較するだけです。見出しを付けずに空白を考慮しないでください。 – user3727540

+0

更新します。 – GhostCat

答えて

0

csvを解析して行のリストを比較するには、commons-csvまたはその他のcsvライブラリを使用できます。これにより、行を列ごとに比較することができ、csvエスケープや異なる区切り文字などを補うこともできます。

文字列を同じように扱えば幸いです行のLinkedHashSetに切り替えます。これは注文を保存します。私はあなたがなぜセットを使っているのかは分かりません。だから多分あなたはリストを使うべきです。いずれにせよ、あなたは注文を保存します。

次に、java 8ストリームを使用して、両方のコレクションで何らかの処理と正規化を行うことができます(最初のスキップ、空の行のフィルタリング、後続の空白、改行などの正規化)。

+0

私はこのように2つのストリームを解析しました。 \tリスト actualCSVRecords = CSVFormat.RFC4180.parse(actualCSVReader).getRecords(); \t \tリスト expectedCSVRecords = CSVFormat.RFC4180.parse(expectedCSVReader).getRecords(); しかし、たとえば私が実際のCSVRecords.equals(expectedCSVRecords)が偽であると主張した場合は、それを行う正しい方法は何ですか? – user3727540

+0

あなたは何を比較しているのかのデータの例を提供することができます。私が知っていることは、あなたのテストがすでにあなたに伝えていることです:彼らは同じではありません。どのように異なっているのか把握し、それを補うようにしてください。また、List equalsは深いequalsをしていないかもしれません... –

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 

最後にあります。 2つのファイルの行数が異なる場合は、「失敗」します。ここでの唯一の注意点。場合:

file1: 
"value value", "B" 

file2: 
"value value", "B" 

ない等しい(なぜならCSV内のスペースの「列データ」)、次いで上記習慣仕事です。その後、あなたの手を手に入れるにはCSVパーサーが必要ですパースされたコンテンツ;それを比較する。

+0

コンテンツをもう一度解析することをお勧めしますか? – user3727540

+0

Alas;私は私の最初のコメントに戻すことを提案しています。私が今まで試したことは、あなたが必要とするものではないようです。しかし、私は本当にあなたが欲しいものは何もない**手がかりを持っています。 TRUE [mcve]を入力し、入力と期待出力/動作を記述します。前述のように、あなたは注文について気になると言いますが、単純にハッシュセットを使いたいとします。私はそのすべてが何を意味するのか分かりません。 – GhostCat

+0

これは私がここでStackOverflowで見つけた解決策でした。私はcsvストリームを入力し、それをspefiedフィールドに従ってソートし、その結果をoutputStreamに返す関数を持っています。このテストでは、outputStreamコンテンツと正しいソート済みストリームのコンテンツを比較したいと思います。そのため、ヘッダーと空白を気にする必要はありません。 – user3727540

関連する問題