2013-04-09 21 views
16

Ruby ile bir csv dosyasına sütun yazmakta sorun yaşıyorum. Aşağıda kod snippet'ım var.Ruby ile bir csv dosyasına sütun başlığı nasıl yazılır?

calc = numerator/denominator.to_f 
data_out = "#{numerator}, #{denominator}, #{calc}" 
File.open('cdhu3_X.csv','a+') do|hdr| 
     hdr << ["numerator","denominator","calculation\n"] #< column header 
      hdr << "#{data_out}\n" 
end 

kod her satırı için sütun başlıkları ekler ve sadece veri her sütunun tepesinde olması gerekiyor. Burada ve diğer yerlerde arama yaptım ama nasıl yapıldığını açık bir cevap bulamıyorum. Herhangi bir yardım büyük takdir edilecektir.

cevap

6

Bunu yapmanın en temiz yolu, dosyayı bir kez 'w' modunda açmak, üstbilgileri yazmak ve ardından verileri yazmaktır.

Bunu yapamayacak bazı teknik nedenler varsa (örneğin, veriler bir kerede mevcut değildir), geçerli dosya konumunu döndürmek için dosyadaki IO#tell yöntemini kullanabilirsiniz. Eğer ekleme için dosyayı açtığınızda, pozisyon dosyanın sonuna ayarlı, böylece akım dosya konumu sıfır, ardından dosya yeni oluşturulan edildi ve hiçbir başlıklarını varsa:

File.open('cdhu3_X.csv', 'a+') do |hdr| 
    if hdr.tell() == 0 # file is empty, so write header 
    hdr << "numerator, denominator, calculation\n" 
    end 
    hdr << "#{data_out}\n" 
end 
+0

Merhaba, işe yaradı. Teşekkür ederim. Jfleck – Joe

38

ben tavsiye ederim Eğer w seçeneğini kullanamıyorsanız

require 'csv' 

CSV.open('test.csv','w', 
    :write_headers=> true, 
    :headers => ["numerator","denominator","calculation"] #< column header 
) do|hdr| 
    1.upto(12){|numerator| 
    1.upto(12){ |denominator| 
     data_out = [numerator, denominator, numerator/denominator.to_f] 
     hdr << data_out 
    } 
    } 
end 

ve gerçekten a+ (örneğin veri kerede tüm mevcut değildir), o zaman aşağıdaki yöntemi deneyebilirsiniz gerekir: yerine CSV kütüphane kullanımı :

require 'csv' 

column_header = ["numerator","denominator","calculation"] 
1.upto(12){|numerator| 
    1.upto(12){ |denominator| 
    CSV.open('test.csv','a+', 
     :write_headers=> true, 
     :headers => column_header 
    ) do|hdr| 
      column_header = nil #No header after first insertion 
      data_out = [numerator, denominator, numerator/denominator.to_f] 
      hdr << data_out 
     end 
    } 
} 
2

csv dosyasını işlemenin en iyi yolu Ruby's CSV modülünü kullanmaktır.

CSV kodunu okuduktan sonra aynı problemi yaşadım. En verimli bulduğum bu çözümün karşısına geçtim.

+1

Bazı verileri ekledikten sonra orijinal üstbilgileri nasıl değiştiririm? Ek sütunlarım olabileceğini, ancak verilerin doldurulduktan sonra olacağını söyleyebilir miyim? Csv.headers.push'ı denedim, ancak çıktıdaki dosyadaki gerçek başlıkları güncelleştirmiyor. Teşekkürler – scanales

İlgili konular