Ruby'de bir CSV dosyasının bazı sütunlarının tek bir sütunda farklı verilerle bir kopyasını nasıl oluşturabilirim?


85

"A.csv" adında bir CSV dosyam var. "A.csv" verilerini içeren "B.csv" adlı yeni bir CSV dosyası oluşturmam gerekiyor.

"A.csv" deki sütunların bir alt kümesini kullanacağım ve bir sütunun değerlerini "B.csv" deki yeni değerlere güncellemem gerekecek. Nihayetinde, B.csv'den alınan bu verileri bir veritabanına göre doğrulamak için kullanacağım.

  1. Nasıl yeni bir CSV dosyası oluşturabilirim?
  2. A.csv'deki gerekli sütunların verilerini "B.csv" ye nasıl kopyalarım?
  3. Belirli bir sütun için değerleri nasıl eklerim?

Ruby'de yeniyim, ancak bir dizi veya karma almak için CSV okuyabiliyorum.


2
Bu, sorunu çözmek için gösterdiğiniz çabayı bize göstermek gibi temel bilgilerden yoksundur. Bu bilgiler CSV belgelerinde bulunmaktadır. " Nasıl Sorulur " ve " tekrarlanabilir minimum örnek " i okuyun.
The Tin Man

Yanıtlar:


193

Mikeb'in belirttiği gibi, dokümanlar var - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - Veya aşağıdaki örneklerle birlikte takip edebilirsiniz (tümü test edilmiştir ve Çalışma):

Yeni bir dosya oluşturmak için:

Bu dosyada iki satırımız olacak, bir başlık satırı ve veri satırı, çok basit CSV:

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

sonuç, aşağıdaki "file.csv" adlı bir dosya:

animal,count,price
fox,1,$90.00

Bir CSV'ye nasıl veri eklenir

"Wb" modunu kullanmak yerine yukarıdaki formülle hemen hemen aynı formül, "a +" modunu kullanacağız. Bunlar hakkında daha fazla bilgi için şu yığın taşması yanıtına bakın: Ruby File.open modları ve seçenekleri nelerdir?

CSV.open("file.csv", "a+") do |csv|
  csv << ["cow", "3","2500"]
end

Şimdi file.csv dosyamızı açtığımızda elimizde:

animal,count,price
fox,1,$90.00
cow,3,2500

CSV dosyamızdan okuyun

Artık bir dosyaya nasıl kopyalanıp yazılacağını, bir CSV'nin nasıl okunacağını ve dolayısıyla manipülasyon için verileri nasıl alacağınızı biliyorsunuz:

CSV.foreach("file.csv") do |row|
  puts row #first row would be ["animal", "count", "price"] - etc.
end

Elbette bu, bu mücevheri kullanarak bir CSV'den bilgi almanın yüzlerce farklı yolundan biri gibidir. Daha fazla bilgi için, bir rehberiniz olduğuna göre şimdi dokümanları ziyaret etmenizi öneririm: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


Ya hemen yazmadan açmak istersem? Sadece bloğu kullanmıyor musunuz?
Donato

kopyalayıp yapıştırılabilir kod için teşekkürler! - yazmak için fazla tembel.
DominikAngerer

Bu, yeni bir CSV oluşturmayı kapsar, ancak daha sonra mevcut sütunların bir alt kümesini kopyalama ve değerlerini değiştirme veya ekleme isteğini ele almak yerine tüm satırların eklenmesi ve okunması hakkındaki bilgilere girer. OP ile aynı türden bir projem var ve dokümantasyon ya da bu cevap bana yardımcı olmadı, bu yüzden umarım bir kez çözdüğümde daha spesifik bir cevap vermek için buraya geri gelebilirim.
Tyler James Young

4

Ruby'nin CSV sınıfını gördünüz mü? Oldukça kapsamlı görünüyor. Şuradan kontrol edin: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


1
bağlantı için teşekkürler. Ben ona atıfta bulunacağım. Csv dosyasını Ruby ile düzenleyebilir miyim? Yani csv'de bir sütun değerlerini güncelleyebilir miyim? daha sonra yalnızca gerekli sütunların karması alınsın mı?
user1718712

0

Muhtemelen CSV::parseRuby'nin CSV'nizi olduğu gibi veri tablosu olarak anlamasına yardımcı olmak ve başlığa göre değerlere kolay erişim sağlamak için kullanmak isteyeceksiniz .

Ne yazık ki, mevcut dokümantasyon CSV::parseyöntemine çok açık nasıl aslında bu amaç için kullanmak yapmaz.

Benzer bir görevim vardı ve rubyguides.com'daki Ruby ile CSV Dosyalarını Okumak ve Ayrıştırmak , CSV sınıfı belgelerinden veya buradan ona işaret eden cevaplardan çok daha fazla yardımcı oldu .

Bu sayfanın tamamını okumanızı tavsiye ederim. Önemli kısım, belirli bir CSV'yi aşağıdakileri CSV::Tablekullanarak bir nesneye dönüştürmekle ilgilidir :

table = CSV.parse(File.read("cats.csv"), headers: true)

Şimdi sınıfta belgelerCSV::Table var , ancak yine rubyguides.com sayfasındaki açık örneklerden daha fazla yardım alabilirsiniz. Vurgulayacağım bir şey, .parsebaşlıkları beklemenizi söylediğinizde , ortaya çıkan tablonun ilk veri satırını satır olarak ele alacağıdır [0].

Muhtemelen özellikle .by_colyeni Tablenesneniz için mevcut olan yöntemle ilgileneceksiniz . Bu, girdi ve / veya çıktıdaki farklı sütun dizin konumlarında yineleme yapmanıza ve birinden diğerine kopyalamanıza veya çıktıya yeni bir değer eklemenize olanak tanır. Çalıştırırsam geri dönüp bir örnek göndereceğim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.