2017-01-15 11 views
1

いくつかのcsvデータから重複したデータを削除しようとしていますが、これを行うコードはすべての行を消去しています。 重複しているかどうかを確認して、両方のフィールドが一致しているかどうかを確認して、.allがtrueの場合にのみtrueを返し、結果を無視して何らかの理由で何らかの理由で何らかの理由で結果が失われる(trueまたはfalse) )。複数のcsv_filesから重複した日付を削除しようとしています

私は、忘れていましたが、csv_dataは複数のcsv_filesが読み込まれてプッシュされた配列です。 また、重複検査は、ある行の列と、別の表の別の行の列とを比較します。

csv_data.each_with_index do |table,table_id| 
    table.each do |row| 
     csv_data.each_with_index do |compair_table,compair_table_id| 
     compair_table.delete_if do |compair_row| 
      if compair_table_id == table_id 
      false 
      else 
      if(columns.all? do |field| 
       row[field] == compair_row[field] 
      end) 
       true 
      else 
       false 
      end 
      end 
     end 
     end 
    end 
    end 

私は間違っていますか?私は別のアプローチを完全に試みるべきですか?

+0

を 'columns'が定義されている方法は? –

+0

CSVファイルのサイズはどれくらいですか? –

答えて

2

あなたはtable呼んで何の問題

は何をrow呼び出しが実際cellで、fieldは実際にこのcell内部の文字で、実際にrowです。

セル全体を比較するのではなく、セルを比較しています。 CSVの任意の場所に2回以上表示されるセルは、削除されます。

:あなたはあなただけのブロックでuniqを使用して、行にそれを適用することができ

[["a", "b", "c"], ["d", "e", "f"], [], ["g", "h", "i"], [], ["x", "z"]] 

ソリューション

を取得

csv_data = CSV.parse("a,b,c\nd,e,f\na,b,c\ng,h,i\nd,h,c\nx,a,z") 
columns = [0,1,2] 

unique_rowsが今配列であること

require 'csv' 

csv_data = CSV.parse("a,b,c\nd,e,f\na,b,c\ng,h,i\nd,h,c\na,b,z") 

columns = [0, 1] 
unique_rows = csv_data.uniq! { |x| x.values_at(*columns) } 
p unique_rows 
#=> [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"], ["d", "h", "c"]] 

注:この例では、前の行と同じ第2のセルを有する任意の行を削除します。

複数のテーブル

あなたは、複数のテーブル間で一意の行をしたい場合は、あなただけの最初のすべての行に参加することができます:

all_rows = csv_tables.flatten_map{|table| table.to_a} 
+0

うんうん、私はcsv_dataが複数のcsvファイルがプッシュされている配列だと言いました。私に100%。また、複製はあるcsvテーブルから別のcsvテーブルへの複製であり、各テーブル内に重複はありません。 – Thermatix

+0

それで、複数のテーブルを持つロジックはどうでしょうか?すべてのテーブルで一意の行を使用するのか、各テーブルで一意の行のみを使用するのか –

+1

はすべてのテーブルでユニークですが、私がそれらをマージすることはできません。なぜなら...うーん、最初に結合してから、マージしたテーブル全体をユニークにすることができます... – Thermatix

関連する問題