Экспорт Ruby Hash в CSV [дубликат]

Что вы спрашиваете, почему это:

def func(a=[], b = 2):
    pass

не является внутренне эквивалентным этому:

def func(a=None, b = None):
    a_default = lambda: []
    b_default = lambda: 2
    def actual_func(a=None, b=None):
        if a is None: a = a_default()
        if b is None: b = b_default()
    return actual_func
func = func()

, за исключением случая прямого вызова func (None , None), которые мы будем игнорировать.

Другими словами, вместо оценки параметров по умолчанию, почему бы не сохранить их каждый из них и оценить их при вызове функции?

Один ответ, вероятно, прямо там - он фактически превратит каждую функцию с параметрами по умолчанию в закрытие. Даже если это все скрыто в интерпретаторе, а не полномасштабное закрытие, данные должны быть где-то сохранены. Он будет медленнее и будет использовать больше памяти.

32
задан tbuehlmann 18 November 2011 в 16:48
поделиться

7 ответов

Попробуйте следующее:

require 'csv'
h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
CSV.open("data.csv", "wb") {|csv| h.to_a.each {|elem| csv << elem} }

Результат:

1.9.2-p290:~$ cat data.csv 
dog,canine
cat,feline
donkey,asinine
40
ответ дан Sławosz 22 August 2018 в 03:20
поделиться
  • 1
    Да, это была идея. конвертировать его обратно в массив .. очень круто спасибо! и используя блок, чтобы сделать это плюс 5 баллов !! дай пять! :) – TheLegend 18 November 2011 в 16:21
  • 2
    плохо проголосовать за свой ответ, когда я уйду. :) – TheLegend 18 November 2011 в 16:27

Если вы хотите заголовки столбцов, и у вас есть несколько хэшей:

require 'csv'
hashes = [{'a' => 'aaaa', 'b' => 'bbbb'}]
column_names = hashes.first.keys
s=CSV.generate do |csv|
  csv << column_names
  hashes.each do |x|
    csv << x.values
  end
end
File.write('the_file.csv', s)

(проверено на Ruby 1.9.3-p429)

51
ответ дан Joe Goggins 22 August 2018 в 03:20
поделиться
  • 1
    Ни один из других ответов не работал для меня, чтобы сохранить заголовки столбцов. Этот ответ работает отлично – Nuno Costa 22 September 2015 в 12:17
  • 2
    CSV.generate очень удобно, если вы не хотите выводить файл на диск. – Beejamin 25 October 2016 в 23:14
  • 3

Я попробовал решения здесь, но получил неверный результат (значения в неправильных столбцах), так как мой источник - это файл 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
1
ответ дан peter 22 August 2018 в 03:20
поделиться

CSV может принимать хеш в любом порядке, исключать элементы и опускать параметры не в HEADERS

require "csv"
HEADERS = [
  'dog',
  'cat',
  'donkey'
]

def write_file

  CSV.open("data.csv", "wb", :headers => HEADERS, :write_headers => true) do |csv|
    csv << { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
    csv << { 'dog' => 'canine'}
    csv << { 'cat' => 'feline', 'dog' => 'canine', 'donkey' => 'asinine' }
    csv << { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine', 'header not provided in the options to #open' => 'not included in output' }
  end
end

write_file # => 
# dog,cat,donkey
# canine,feline,asinine
# canine,,
# canine,feline,asinine
# canine,feline,asinine

. Это делает работу с классом CSV более гибкой и удобочитаемой.

6
ответ дан rudolph9 22 August 2018 в 03:20
поделиться

Попробуйте следующее:

require 'csv'
data = { 'one' => '1', 'two' => '2', 'three' => '3' }

CSV.open("data.csv", "a+") do |csv|
        csv << data.keys
        csv << data.values
end
1
ответ дан Santosh Sharma 22 August 2018 в 03:20
поделиться

Предположим, что у нас есть хэш,

hash_1 = {1=>{:rev=>400, :d_odr=>3}, 2=>{:rev=>4003, :d_price=>300}}

Вышеупомянутый hash_1 имеет ключи как некоторые id 1,2, ... и значения для них снова хеш с некоторыми ключами как (: rev,: d_odr ,: d_price). Предположим, что нам нужен CSV-файл с заголовками,

headers = ['Designer_id','Revenue','Discount_price','Impression','Designer ODR']

Затем создайте новый массив для каждого значения hash_1 и вставьте его в файл CSV,

CSV.open("design_performance_data_temp.csv", "w") do |csv|
 csv << headers
 csv_data = []
 result.each do |design_data|
  csv_data << design_data.first
  csv_data << design_data.second[:rev] || 0
  csv_data << design_data.second[:d_price] || 0
  csv_data << design_data.second[:imp] || 0
  csv_data << design_data.second[:d_odr] || 0
  csv << csv_data
  csv_data = []
 end
end

Теперь у вас есть файл design_performance_data_temp.csv, сохраненный в соответствующем каталоге. Более высокий код может быть оптимизирован.

0
ответ дан shubham mishra 22 August 2018 в 03:20
поделиться

Я думаю, что самое простое решение для вашего исходного вопроса:

def write_file
  h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }

  CSV.open("data.csv", "w", headers: h.keys) do |csv|
    csv << h.values
  end
end

С несколькими хэшами, которые имеют общие ключи:

def write_file
  hashes = [ { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' },
             { 'dog' => 'rover', 'cat' => 'kitty', 'donkey' => 'ass' } ]

  CSV.open("data.csv", "w", headers: hashes.first.keys) do |csv|
    hashes.each do |h|
      csv << h.values
    end
  end
end
23
ответ дан Tom Rossi 22 August 2018 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: