Давайте сначала прочитаем в csv (не обрабатывает экранирование или кавычки, просто пример)
csv = []
columns = []
File.read('csv.file') do |row|
if csv.empty?
columns=row.split(',')
else
row_data={}
row.split(',').each_with_index do |c,i|
row_data[columns[i]] = c
end
csv << row_data
end
end
Хорошо, что мы будем делать с данными?Это выглядит так:
[{'surname' => 'smith', 'postcode' => '1234', 'otherstuff' => 'xyz' },
{'surname' => 'jones', 'postcode' => '1234', 'otherstuff' => 'xyz' },
{'surname' => 'smith', 'postcode' => '2345', 'otherstuff' => 'xyz' },
{'surname' => 'smith', 'postcode' => '1234', 'otherstuff' => 'xyz' }]
Как насчет чего-то вроде:
csv.select do |c|
csv.any? do |s|
s['surname'].eql?(c['surname']) && s['postcode'].eql?(c['postcode'])
end
end
Хорошо, это медленно и не умно.Давайте перейдем к решению 2, сгенерируем хеш-ключ из данных, которые мы хотим проверить на уникальность:
sneakyhash={}
csv.each do |row|
magic_string = [row['surname'], row['postcode']].join("--MaGiCaL--SpLiTTinG--StRiNG--")
if sneakyhash[magic_string].nil?
sneakyhash[magic_string] = 1
else
puts "this guy looks suspicious: " + row.join(,)
end
end
Далеко от оптимального, но просто обдумать вслух.Если это «одноразовая» вещь, и вам просто нужно проанализировать файл, перейдите к тому, что вы можете придумать.
Что вы, вероятно, захотите сделать, - это сохранить эту идентифицирующую строку в массиве или хэше во время чтения CSV-файла и посмотреть, соответствует ли текущая строка какой-либо из сохраненных уникальных строк и что-то сделать, если это произойдет.