2015-04-01 4 views
1

У меня есть CSV-файл со следующими даннымиУдаление дубликатов из файла CSV, используя рубин

Sno Scenario Result Description 
1 Sce_1 Pass Pass 
2 Sce_2 Pass Pass 
1 Sce_1 Fail Failed 

В этом случае у меня есть 2 одинаковые серийные номера. Я хотел бы видеть только строку с результатом Pass и удалить остальные повторяющиеся строки.

Я пробовал следующее, но все еще не могу его получить!

CSV.open('New.csv', 'w') do |csv| 
    CSV.read('Merged_files.csv').uniq!{|x| x[1]}.each do |row| 
     csv << row 
    end 
end 

Может ли кто-нибудь помочь мне в получении логики!

+0

CSV-файл, как показано ниже: Sno Сценарий Результат 1 Sce_1 Pass Pass 2 Sce_2 Pass Pass 1 Sce_1 Fail Failed – Ramya

+0

Вы должны использовать 'uniq', а не' uniq! ', Поскольку последний возвращает' nil', если никаких изменений не сделано. –

ответ

1

Для иллюстрации я добавил четвертую строку в таблицу:

require 'csv' 

arr = CSV.read("x.csv") 
    #=> [["Sno", "Scenario", "Result", "Description"], 
    # ["1", "Sce_1", "Pass", "Pass"], 
    # ["2", "Sce_2", "Pass", "Pass"], 
    # ["1", "Sec_1", "Fail", "Pass"], 
    # ["3", "Sec_3", "Fail", "Pass"]] 

Вы можете удалить ненужные элементы следующим образом:

arr[1..-1].group_by(&:first).map { |_,a| 
    (a.size > 1) ? a.reject { |e| e[2]=="Fail" } : a } 
    #=> [[["1", "Sce_1", "Pass", "Pass"]], 
    # [["2", "Sce_2", "Pass", "Pass"]], 
    # [["3", "Sec_3", "Fail", "Pass"]]] 

Шаги:

h = arr[1..-1].group_by(&:first) 
    #=> {"1"=>[["1", "Sce_1", "Pass", "Pass"], 
    #   ["1", "Sec_1", "Fail", "Pass"]], 
    # "2"=>[["2", "Sce_2", "Pass", "Pass"]], 
    # "3"=>[["3", "Sec_3", "Fail", "Pass"]]} 

h.map { |_,a| (a.size > 1) ? a.reject { |e| e[2]=="Fail" } : a } 
    #=> [[["1", "Sce_1", "Pass", "Pass"]], 
    # [["2", "Sce_2", "Pass", "Pass"]], 
    # [["3", "Sec_3", "Fail", "Pass"]]] 

Если для данного Sno/Scenario есть не более одного номера "Pass", вы можете использовать Enumerable#flat_map вместо:

a = h.flat_map { |_,a| (a.size > 1) ? a.reject { |e| e[2]=="Fail" } : a } 
    #=> [["1", "Sce_1", "Pass", "Pass"], 
    # ["2", "Sce_2", "Pass", "Pass"], 
    # ["3", "Sec_3", "Fail", "Pass"]] 

Если вы хотите добавить обратно строку заголовка:

a.unshift(arr.first) 
    #=> [["Sno", "Scenario", "Result", "Description"], 
    # ["1", "Sce_1", "Pass", "Pass"], 
    # ["2", "Sce_2", "Pass", "Pass"], 
    # ["3", "Sec_3", "Fail", "Pass"]] 

Если вы хотите исключить все «глючить» строку, даже если нет correponding «Pass» строки (как для Sno == "3"), вы можете сделать это:

h.flat_map { |_,a| a.reject { |e| e[2]=="Fail" } } 
    #=> [["1", "Sce_1", "Pass", "Pass"], 
    # ["2", "Sce_2", "Pass", "Pass"]] 
+0

Спасибо! Попробуем. – Ramya

Смежные вопросы