2012-07-31 9 views
18

रूबी के CSV वर्ग यह बहुत आसान प्रत्येक पंक्ति से अधिक पुनरावृति करने के लिए बनाता है:रुबी में सीएसवी पढ़ने पर मैं हेडर पंक्ति को कैसे छोड़ सकता हूं?

CSV.foreach(file) { |row| puts row } 

बहरहाल, यह हमेशा शीर्षक पंक्ति शामिल हो, तो मैं आउटपुट के रूप में मिल जाएगा:

header1, header2 
foo, bar 
baz, yak 

मुझे नहीं पता हालांकि हेडर चाहते हैं। अब, जब मैं फोन ...

CSV.foreach(file, :headers => true) 

मैं इस परिणाम मिलता है:

#<CSV::Row:0x10112e510 
    @header_row = false, 
    attr_reader :row = [ 
     [0] [ 
      [0] "header1", 
      [1] "foo" 
     ], 
     [1] [ 
      [0] "header2", 
      [1] "bar" 
     ] 
    ] 
> 
बेशक

, क्योंकि प्रलेखन कहते हैं:

यह सेटिंग #shift सीएसवी के रूप में पंक्तियों को वापस करने के लिए कारण बनता है: : Arrays के बजाय पंक्ति वस्तुओं

लेकिन, कैसे कर सकते हैं मैं हेडर पंक्ति को छोड़ देता हूं, पंक्ति को एक साधारण सरणी के रूप में वापस कर रहा हूं? मैं जटिल CSV::Row ऑब्जेक्ट को वापस नहीं करना चाहता हूं।

मैं निश्चित रूप से ऐसा करने के लिए नहीं करना चाहती:

first = true 
CSV.foreach(file) do |row| 
    if first 
    puts row 
    first = false 
    else 
    # code for other rows 
    end 
end 
+0

जांचें http://stackoverflow.com/a/37856698/473040 – equivalent8

उत्तर

12

#shift सीएसवी कक्षा से कम से देखो:

प्राथमिक लिपटे तार और iOS के लिए पढ़ने के लिए विधि, एक ही पंक्ति से खींचा जाता है डेटा स्रोत, पार्स और क्षेत्रों की एक सरणी (यदि हेडर पंक्तियों उपयोग नहीं किया जाता)

एक उदाहरण के रूप में लौटे:

require 'csv' 

# CSV FILE 
# name, surname, location 
# Mark, Needham, Sydney 
# David, Smith, London 

def parse_csv_file_for_names(path_to_csv) 
    names = [] 
    csv_contents = CSV.read(path_to_csv) 
    csv_contents.shift 
    csv_contents.each do |row| 
    names << row[0] 
    end 
    return names 
end 
+0

CSV.read रिटर्न उत्तर ऐरे और # शिफ्ट सरणी के लिए डिफ़ॉल्ट विधियां हैं। और यहां सही रूप से बहुत उपयोगी है। – PriteshJ

+0

आप 'प्रत्येक_with_index' का उपयोग करके पुन: प्रयास कर सकते हैं और जांच सकते हैं कि आप किस लाइन इंडेक्स पर हैं। एक 'अगला अगर (i == 0)' सूचकांक के लिए पहली पंक्ति को छोड़ देगा 'i'। – tadman

+0

@tadman इसे एक अलग उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें - व्यवहार्य दिखता है। – slhck

10

आप के रूप में उल्लेख here

+1

नोट: यह केवल रूबी के बाद से काम करता है 1.9 – inger

+8

अतिरिक्त नोट: यदि आप <रूबी 1.9 का उपयोग कर रहे हैं तो आपको वास्तव में अपडेट करना चाहिए। – ocodo

6

हेडर अनदेखी करने के लिए एक अच्छा तरीका एक सरणी के रूप में यह पढ़ सकते हैं और पहली पंक्ति की अनदेखी करने के है CSV.parse(csv_file, { :headers => false }) और एक ब्लॉक गुजर विचार करने के लिए, चाहते हो सकता है:

data = CSV.read("dataset.csv")[1 .. -1] 
# => [["first_row", "with data"], 
     ["second_row", "and more data"], 
     ... 
     ["last_row", "finally"]] 

:headers => false दृष्टिकोण के साथ समस्या यह है कि CSV शीर्ष पंक्ति के रूप में पहली पंक्ति को पढ़ने की कोशिश नहीं करेगा, लेकिन यह डेटा का हिस्सा मानेगा। तो, मूल रूप से, आपके पास बेकार पहली पंक्ति है।

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

  • कोई संबंधित समस्या नहीं^_^