Я попробовал решения здесь, но получил неверный результат (значения в неправильных столбцах), так как мой источник - это файл LDIF, который не всегда имеет все значения для ключа. В конце концов я использовал следующее.
Во-первых, при создании хэша я помню ключи в отдельном массиве, которые я расширяю с помощью ключей, которые не были там уже.
# building up the array of hashes
File.read(ARGV[0]).each_line do |lijn|
case
when lijn[0..2] == "dn:" # new record
record = {}
when lijn.chomp == '' # end record
if record['telephonenumber'] # valid record ?
hashes << record
keys = keys.concat(record.keys).uniq
end
when ...
end
end
Важной линией здесь является keys = keys.concat(record.keys).uniq
, которая расширяет массив ключей при обнаружении новых ключей (заголовков).
Теперь самое важное: преобразование наших хэшей в CSV
CSV.open("export.csv", "w", {headers: keys, col_sep: ";"}) do |row|
row << keys # add the headers
hashes.each do |hash|
row << hash # the whole hash, not just the array of values
end
end