मैं एक कॉलम में अलग-अलग डेटा के साथ रूबी में एक सीएसवी फ़ाइल के कुछ कॉलम की एक प्रतिलिपि कैसे बना सकता हूं?


84

मेरे पास एक CSV फ़ाइल है, जिसका नाम "A.csv" है। मुझे "A.csv" के डेटा के साथ "B.csv" नामक एक नई CSV फ़ाइल जेनरेट करनी होगी।

मैं "A.csv" से स्तंभों के सबसेट का उपयोग करूंगा और "B.csv" में नए मानों के लिए एक कॉलम के मानों को अपडेट करना होगा। अंततः, मैं डेटाबेस के विरुद्ध सत्यापन के लिए B.csv से इस डेटा का उपयोग करूंगा।

  1. मैं एक नई CSV फ़ाइल कैसे बनाऊँ?
  2. मैं A.csv से "B.csv" के लिए आवश्यक कॉलम के डेटा को कैसे कॉपी करूं?
  3. मैं किसी विशेष कॉलम के लिए मूल्यों को कैसे जोड़ सकता हूं?

मैं रूबी के लिए नया हूं, लेकिन एक सरणी या हैश पाने के लिए मैं सीएसवी पढ़ने में सक्षम हूं।


2
इसमें मूलभूत जानकारी का अभाव है, जैसे कि समस्या को हल करने की दिशा में हमारा प्रयास। यह जानकारी सीएसवी प्रलेखन में है। " कैसे पूछें " और " न्यूनतम प्रजनन योग्य उदाहरण " पढ़ें ।
टिन मैन

जवाबों:


191

जैसा कि माईकब ने बताया, डॉक्स हैं - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - या आप नीचे दिए गए उदाहरणों के साथ अनुसरण कर सकते हैं (सभी का परीक्षण किया गया है और काम कर रहे):

एक नई फ़ाइल बनाने के लिए:

इस फ़ाइल में हमारे पास दो पंक्तियाँ होंगी, एक शीर्ष लेख पंक्ति और डेटा पंक्ति, बहुत ही सरल CSV:

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

परिणाम, निम्नलिखित के साथ एक फ़ाइल "file.csv":

animal,count,price
fox,1,$90.00

CSV में डेटा कैसे जोड़ा जाए

"Wb" मोड का उपयोग करने के बजाय केवल ऊपर जैसा ही सूत्र, हम "a +" मोड का उपयोग करेंगे। इन पर अधिक जानकारी के लिए यह स्टैक ओवरफ्लो उत्तर देखें: रूबी फाइल.पेन मोड और विकल्प क्या हैं?

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

अब जब हम अपनी फ़ाइल खोलते हैं। हमारे पास:

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

हमारी CSV फ़ाइल से पढ़ें

अब आप जानते हैं कि एक CSV को पढ़ने के लिए फाइल को कैसे लिखना है और कैसे लिखना है, इसलिए आपके द्वारा किए गए हेरफेर के लिए डेटा को पकड़ो:

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

बेशक, यह एक सौ अलग-अलग तरीकों में से एक जैसा है आप इस रत्न का उपयोग करके सीएसवी से जानकारी खींच सकते हैं। अधिक जानकारी के लिए, मेरा सुझाव है कि अब आप डॉक्स पर जाएँ: आपके पास एक प्राइमर है: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


क्या होगा अगर मैं तुरंत लिखे बिना खोलना चाहता हूं? बस ब्लॉक का उपयोग न करें?
डोनाटो

कॉपी और पेस्ट सक्षम कोड के लिए धन्यवाद! - यह लिखने के लिए बहुत आलसी।
डॉमिनिकऑनर

यह एक नया CSV बनाता है, लेकिन फिर उपलब्ध कौमों के सबसेट को कॉपी करने के अनुरोध को संबोधित करने के बजाय पूरी पंक्तियों को जोड़ने और पढ़ने के बारे में जानकारी में चला जाता है और या तो बदल देता है या अपने मूल्यों को जोड़ता है। मेरे पास ओपी के रूप में एक ही तरह की परियोजना है और दस्तावेज़ीकरण या इस जवाब से मदद नहीं मिली है, इसलिए उम्मीद है कि मैं एक बार और अधिक विशिष्ट उत्तर प्रदान करने के लिए यहां आ सकता हूं।
टायलर जेम्स यंग

3

क्या आपने रूबी का CSV क्लास देखा है? यह काफी व्यापक लगता है। इसे यहां देखें: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


1
लिंक के लिए धन्यवाद। मैं इसका जिक्र करूंगा। क्या मैं माणिक के माध्यम से सीएसवी फ़ाइल को संपादित कर सकता हूं? मेरा मतलब है कि मैं सीएसवी में एक कॉलम मान अपडेट कर सकता हूं? बाद में केवल आवश्यक कॉलम का हैश मिला?
user1718712

0

आप शायद CSV::parseरूबी को अपने CSV को डेटा की तालिका के रूप में समझने में मदद करने के लिए उपयोग करना चाहते हैं जो कि यह है और हेडर द्वारा मूल्यों तक आसान पहुंच को सक्षम करता है।

दुर्भाग्य से, विधि परCSV::parse उपलब्ध प्रलेखन यह बहुत स्पष्ट नहीं करता है कि वास्तव में इस उद्देश्य के लिए इसका उपयोग कैसे करें।

मुझे एक समान कार्य मिला था और रूबी के साथ सीएसवी फाइलें कैसे पढ़ें और पार्स करें इसके द्वारा बहुत अधिक मदद की गई थी CSV वर्ग प्रलेखन की तुलना में या यहाँ से इंगित करने वाले उत्तरों द्वारा ।

मैं उस पृष्ठ को उसकी संपूर्णता में पढ़ने की सलाह देता हूं। महत्वपूर्ण भाग किसी दिए गए CSV को CSV::Tableउपयोग करने वाली वस्तु में बदलने के बारे में है :

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

अब कक्षा पर दस्तावेज़ीकरण हैCSV::Table , लेकिन फिर से आपको rubyguides.com पृष्ठ पर स्पष्ट उदाहरणों द्वारा अधिक मदद मिल सकती है। एक बात पर प्रकाश डालूंगा कि जब आप .parseहेडर की अपेक्षा करते हैं, तो परिणामी तालिका डेटा की पहली पंक्ति को पंक्ति के रूप में मानेगी [0]

संभवतः आप .by_colअपनी नई Tableवस्तु के लिए उपलब्ध विधि में विशेष रूप से रुचि लेंगे । यह आपको इनपुट और / या आउटपुट में अलग-अलग कॉलम इंडेक्स पदों के माध्यम से पुनरावृत्ति करने की अनुमति देगा और या तो एक से दूसरे में कॉपी कर सकता है या आउटपुट में एक नया मान जोड़ सकता है। अगर मुझे यह काम आता है, तो मैं वापस आता हूं और एक उदाहरण पोस्ट करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.