2010-08-24 23 views
9

Bir CSV dosyası okumalı, bir alanı güncelleştirmeli ve değişiklikleri kaydetmeliyim. Değişikliklerimi kaydetmem dışında sahadaki değişiklikleri kaydetmem gerekiyor:Bir CSV dosyasını ayrıştırmak, bir alanı güncelleştirmek ve kaydetmek için

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 

Burada ne yapmalıyım? Yaptığım değişiklikleri ve dosyayı güncellemeyi nasıl kaydederim?

cevap

11

Ne yapmalıyım, güncellenmiş kayıtları yeni bir dosyaya yazmanız gerekiyor ve eğer isterseniz, programınızı bitirdikten sonra eski dosyayı silebilir ve orijinal dosya ismine sahip olacak yeni dosyayı yeniden adlandırabilir.

Bunu yapmak için çıkış dosyasını each_with_index döngüsünün dışında kodunuzun en üstünde açacağım. Örneğin.

csv_out.close 

:
csv_out << row 

Sonra sonunda yeni dosyayı kapatabilir:
csv_out = CSV::Writer.generate(File.open('new.csv', 'wb')) 

Sonra each_with_index döngü içinde böyle yeni bir dosyaya geçerli satır yazabilir

Açıklamalarda belirtildiği gibi, CSV::Writer artık standart kitaplıktadır. yeni CSV.foreach (okuma için) ve CSV.open (yazma için) kullanılarak kodun bir eşdeğer sürümü:

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

ben döngü dışında csv_out.close ki? – thatmiddleway

+0

Yep, 'csv_out.close'' her_with_index' döngüsünün dışında olurdu, çünkü bunu yalnızca bir kez yapmak istediğinizde ve orijinal dosyadan satırların üzerinden döngü yapmayı bitirdikten sonra. – mikej

+0

Bu mantıklı, Teşekkürler! – thatmiddleway

İlgili konular