Для иллюстрации я добавил четвертую строку в таблицу:
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"]]
CSV-файл, как показано ниже: Sno Сценарий Результат 1 Sce_1 Pass Pass 2 Sce_2 Pass Pass 1 Sce_1 Fail Failed – Ramya
Вы должны использовать 'uniq', а не' uniq! ', Поскольку последний возвращает' nil', если никаких изменений не сделано. –