1.9.3

2012-03-08 13 views
12

में फ़ाइल में पढ़ने पर पहली पंक्ति को छोड़कर मैं रूबी कार्य के अंदर एक टेक्स्ट फ़ाइल में खोलने और पढ़ने के लिए रूबी की फ़ाइल का उपयोग कर रहा हूं। क्या कोई सेटिंग है जहां मैं निर्दिष्ट कर सकता हूं कि मुझे की पहली पंक्ति चाहिए जो फ़ाइल छोड़ दी गई है? यहाँ मेरी कोड अब तक बताया गया है:1.9.3

desc "Import users." 
    task :import_users => :environment do 
    File.open("users.txt", "r", '\r').each do |line| 
     id, name, age, email = line.strip.split(',') 
     u = User.new(:id => id, :name => name, :age => age, :email => email) 
     u.save 
    end 
    end 

मैं line.lineno की कोशिश की है और यह भी File.open("users.txt", "r", '\r').each do |line, index| और next if index == 0 कर, लेकिन किसी भी भाग्य नहीं किया है।

उत्तर

21

each से each_with_index do |line, index| और next if index == 0 काम करेगा।

9
File.open("users.txt", "r", '\r') do |file| 
    lines = file.lines # an enumerator 
    lines.next #skips first line 
    lines.each do |line| 
    puts line # do work 
    end 
end 

एक गणक का उपयोग करना, जो 'याद करता है' कहां है।

CSV.foreach("users.txt", :headers, :header_converters => :symbol, :col_sep => ',') do |row| 
    User.new(row).save 
end 
4

तुम शायद वास्तव में सीएसवी उपयोग करना चाहते हैं।

4
File.readlines('users.txt')[1..-1].join() 

बहुत अच्छा काम करता है:

14

समारोह drop(n) शुरू से ही n लाइनों को हटा देगा:

File.readlines('users.txt').drop(1).each do |line| 
    puts line 
end 

यह एक सरणी में पूरी फ़ाइल पढ़ सकते हैं और पहले n लाइनों को हटा देगा। यदि आप पूरी फाइल पढ़ रहे हैं वैसे भी यह शायद सबसे सुंदर समाधान है।

+0

आपका मतलब है फ़ाइल.readlines ("users.txt")। ड्रॉप (1)। प्रत्येक करें | रेखा | , आपका उदाहरण एक त्रुटि – peter

+0

हाँ, निश्चित रूप से देता है। यह 'फाइल.readlines' होना चाहिए। धन्यवाद @ पीटर! – Tombart

+0

यह स्वीकार्य उत्तर होना चाहिए! – jpatokal

1

आप आईओ के रूप में पूरे समय (कोई सरणी रूपांतरण) फ़ाइल रखना चाहते हैं और आप पहली पंक्ति में डेटा का उपयोग करने पर योजना बना रहे हैं:

f = File.open('users.txt', 'r') 
first_line = f.gets 
body = f.readlines 

अधिक होने की संभावना है, हालांकि, क्या आप चाहते हैं द्वारा नियंत्रित किया जाता दूसरों के रूप में सीएसवी या फास्टरसीएसवी ने बताया है। एक हैडर लाइन के साथ फ़ाइलों को संभालने के लिए मेरा पसंदीदा तरीके से करना है:

FasterCSV.table('users.txt') 
1
कुछ जवाब के बाद से

(? नहीं रह गया है) रूबी 1.9.3 में काम करते हैं, यहां तीन सर्वश्रेष्ठ तरीकों में से एक काम कर नमूना

# this line must be dropped 
puts "using drop" 
File.readlines(__FILE__).drop(1).each do |line| 
    puts line 
end 
puts "" 

puts "using a range" 
File.readlines(__FILE__)[1..-1].each do |line| 
    puts line 
end 
puts "" 

puts "using enumerator" 
File.readlines(__FILE__).each do |file, w| 
    lines = file.lines # an enumerator 
    lines.next #skips first line 
    lines.each do |line| 
     puts line 
    end 
end 
संबंधित मुद्दे