2010-08-24 6 views
9

सहेजें मुझे एक CSV फ़ाइल पढ़ने, फ़ील्ड अपडेट करने, फिर परिवर्तनों को सहेजने की आवश्यकता है। मैं सब कुछ क्षेत्र मैं अद्यतन करने कर रहा हूँ करने के लिए अपने परिवर्तनों को सहेजे छोड़कर ठीक काम कर रहा है:एक CSV फ़ाइल को कैसे पार्स करें, फ़ील्ड अपडेट करें, फिर

require 'csv' 
@parsed_file = CSV::Reader.parse(File.open("#{RAILS_ROOT}/doc/some.csv")) 
@parsed_file.each_with_index do |row, x| 
    address = row[5] 
    l = Location.address_find(address) 
    if l != nil 
    puts "#{l.name} at #{l.address}" 
    row[14] = l.store_code 
    puts row[14] 
    else 
    puts "No matching address Found!!!" 
    end 
    #What do I do here? Something like this? CSV::Writer.generate(@parsed_file) 
end 

मैं यहाँ क्या करते हैं? मैं किए गए परिवर्तनों को कैसे सहेजूं और फ़ाइल को अपडेट कैसे करूं?

उत्तर

11

मैं क्या करूँगा अद्यतन फ़ाइलों को एक नई फ़ाइल में लिखना है और फिर, यदि आप चाहते हैं, तो अपना प्रोग्राम समाप्त करने के बाद पुरानी फ़ाइल को हटाया जा सकता है और मूल फ़ाइल नाम रखने के लिए नई फ़ाइल का नाम बदल सकता है।

ऐसा करने के लिए मैं each_with_index लूप के बाहर, आपके कोड के शीर्ष पर आउटपुट फ़ाइल खोलूंगा। जैसे

csv_out.close 

:

csv_out << row 

फिर अंत में आप नई फ़ाइल को बंद कर सकते हैं:

csv_out = CSV::Writer.generate(File.open('new.csv', 'wb')) 

फिर अपने each_with_index पाश अंदर आप इस तरह नई फ़ाइल में वर्तमान पंक्ति लिख सकते हैं

टिप्पणियों में उल्लिखित अनुसार, CSV::Writer अब मानक पुस्तकालय में नहीं है। कोड नए CSV.foreach (पढ़ने के लिए) और CSV.open (लेखन के लिए) का उपयोग कर के किसी समान संस्करण है:

CSV.open("path/to/file.csv", "wb") do |csv_out| 
    CSV.foreach("#{RAILS_ROOT}/doc/some.csv") do |row| 
    address = row[5] 
    l = Location.address_find(address) 
    if l != nil 
     puts "#{l.name} at #{l.address}" 
     row[14] = l.store_code 
     puts row[14] 
    else 
     puts "No matching address Found!!!" 
    end 
    csv_out << row 
    end 
end 
+0

मैं पाश बाहर csv_out.close हैं? – thatmiddleway

+0

हाँ, 'csv_out.close'' प्रत्येक_with_index' लूप के बाहर होगा क्योंकि आप केवल एक बार ऐसा करना चाहते हैं और मूल फ़ाइल से पंक्तियों पर लूपिंग समाप्त करने के बाद। – mikej

+0

यह समझ में आता है, धन्यवाद! – thatmiddleway

संबंधित मुद्दे