Во-первых, в вашем коде есть небольшая ошибка. Вместо:
csv << people[0]
Вам нужно будет сделать следующее, если вы не хотите изменять свой код цикла:
csv << people.shift
Теперь следующее решение добавит только первое вхождение человека, отбрасывая любые последующие дубликаты, как определено идентификатором (как я предполагаю, идентификаторы уникальны).
require 'csv'
puts "loading data"
people = CSV.read('input-file.csv')
ids = [] # or you could use a Set
CSV.open("output-file", "wb") do |csv|
#write the first row (header) to the output file
csv << people.shift
people.each do |p|
# If the id of the current records is in the ids array, we've already seen
# this person
next if ids.include?(p[0])
# Now add the new id to the front of the ids array since the example you gave
# the duplicate records directly follow the original, this will be slightly
# faster than if we added the array to the end, but above we still check the
# entire array to be safe
ids.unshift p[0]
csv << p
end
end
Обратите внимание, что существует более производительное решение, если ваши дублирующиеся записи всегда следуют непосредственно за оригиналом, вам нужно будет только сохранить последний идентификатор оригинала и проверить идентификатор текущей записи, а не включать его в массив , Разница может быть незначительной, если ваш входной файл не содержит много записей.
Это будет выглядеть так:
require 'csv'
puts "loading data"
people = CSV.read('input-file.csv')
previous_id = nil
CSV.open("output-file", "wb") do |csv|
#write the first row (header) to the output file
csv << people.shift
people.each do |p|
next if p[0] == previous_id
previous_id = p[0]
csv << p
end
end