2016-08-21 3 views
6

में हैश की सीएसवी को स्मार्ट रूप से कनवर्ट करना मुझे CSV फ़ाइल में हैश की एक सरणी को कन्वर्ट करने की आवश्यकता है। विभिन्न तरीकों मैं सरणी में डालने हैश मान को शामिल पाया:रूबी

class Array 
    def to_csv(csv_filename="hash.csv") 
    require 'csv' 
    CSV.open(csv_filename, "wb") do |csv| 
     csv << first.keys # adds the attributes name on the first line 
     self.each do |hash| 
     csv << hash.values 
     end 
    end 
    end 
end 

दुर्भाग्य से इस विधि की आवश्यकता है सरणी में प्रत्येक तत्व पूरा हो गया है, उदाहरण के लिए, जब मैं इस सरणी यह ​​भी एक मान्य CSV नहीं लौटेगा है :

myarray = [ 
    {foo: 1, bar: 2, baz: 3}, 
    {bar: 2, baz: 3}, 
    {foo: 2, bar: 4, baz: 9, zab: 44} 
] 

मैं एक csv कि सभी संभव हेडर पाता है, और सही क्रम में मान प्रदान करती है, जहां जरूरत खाली स्थान को जोड़ने बनाने के लिए एक रास्ता तलाश कर रहा हूँ।

उत्तर

9

के बारे में क्या:

class Array 
    def to_csv(csv_filename="hash.csv") 
    require 'csv' 
    # Get all unique keys into an array: 
    keys = self.flat_map(&:keys).uniq 
    CSV.open(csv_filename, "wb") do |csv| 
     csv << keys 
     self.each do |hash| 
     # fetch values at keys location, inserting null if not found. 
     csv << hash.values_at(*keys) 
     end 
    end 
    end 
end 
+0

मैं वास्तव में क्या जरूरत है। धन्यवाद! – TopperH

3

मैं इसे इस तरह से करूँगा। यह काफी जानवर बल है, क्योंकि यह और सभी हेडर कि मौजूद खोजने के लिए की जरूरत है भी खाली तत्वों को भरने के लिए की जरूरत है ..

class Array 
    def to_csv(csv_filename='test.csv') 
    require 'csv' 

    headers = [] 
    self.each {|hash| headers += hash.keys} 
    headers = headers.uniq 

    rows = [] 
    self.each do |hash| 
     arr_row = [] 
     headers.each {|header| arr_row.push(hash.key?(header) ? hash[header] : nil)} 
     csv_row = CSV::Row.new(headers, arr_row) 
     rows.push(csv_row) 
    end 
    csv_table = CSV::Table.new(rows) 
    File.open(csv_filename, 'w'){|file| file << csv_table.to_s} 
    end 
end 

CSV::Row और CSV::Table वर्गों पर एक नजर डालें। मैं उन्हें आसान लगता है।