2012-03-08 44 views
12

Tôi đang sử dụng Tệp của ruby ​​để mở và đọc trong tệp văn bản bên trong công việc cào . Có cài đặt nào tôi có thể chỉ định rằng tôi muốn dòng đầu tiên của tệp bị bỏ qua không? Dưới đây là mã của tôi cho đến nay:Bỏ qua dòng đầu tiên khi đọc trong một tệp trong 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 

tôi đã cố gắng line.lineno và cũng làm File.open("users.txt", "r", '\r').each do |line, index|next if index == 0 nhưng đã không có bất kỳ may mắn.

Trả lời

21

Thay đổi each thành each_with_index do |line, index|next if index == 0 sẽ hoạt động.

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 

Sử dụng một điều tra viên 'ghi nhớ' vị trí của nó.

4

Bạn có thực sự muốn sử dụng csv:

CSV.foreach("users.txt", :headers, :header_converters => :symbol, :col_sep => ',') do |row| 
    User.new(row).save 
end 
4
File.readlines('users.txt')[1..-1].join() 

Làm việc tốt quá.

14

chức năng drop(n) sẽ loại bỏ n dòng từ đầu:

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

Nó sẽ đọc toàn bộ tập tin vào một mảng và loại bỏ n dòng đầu tiên. Nếu bạn đang đọc toàn bộ tập tin anyway nó có lẽ là giải pháp thanh lịch nhất.

+0

ý bạn là File.readlines ("users.txt"). (1) .each do | line | , ví dụ của bạn đưa ra một lỗi – peter

+0

Đúng vậy. Nó phải là 'File.readlines'. Cảm ơn @peter! – Tombart

+0

Đây phải là câu trả lời được chấp nhận! – jpatokal

1

nếu bạn muốn giữ lại các tập tin như IO trong suốt thời gian (không chuyển đổi mảng) và bạn có kế hoạch sử dụng dữ liệu trong dòng đầu tiên:

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

Nhiều khả năng, mặc dù những gì bạn muốn được xử lý bởi CSV hoặc FasterCSV như những người khác đã chỉ ra. cách ưa thích của tôi để xử lý các file với một dòng tiêu đề là để làm:

FasterCSV.table('users.txt') 
1

Từ một vài câu trả lời (? không còn) làm việc trong Ruby 1.9.3, đây là một mẫu làm việc trong ba phương pháp tốt nhất

# 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 
Các vấn đề liên quan