2012-03-08 12 views
12

ruby​​のFileを使用して、レーキ タスク内のテキストファイルを開いて読み込みます。 の最初の行をスキップするように指定できる設定はありますか? はここで、これまでに私のコードです: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

はおそらく、本当にCSVファイルを使用します。これは、配列にファイル全体を読んで、最初のn行を削除します

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

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

があまりにも良い作品:

14

機能drop(n)は最初からn行を削除します。とにかくファイル全体を読んでいるのなら、それはおそらくもっとも洗練されたソリューションでしょう。

+0

あなたはFile.readlines( "users.txt")を意味します。drop(1).each do | line | 、あなたの例はエラーを与える – peter

+0

はい、確かに。それは 'File.readlines'でなければなりません。ありがとう@peter! – Tombart

+0

これは受け入れられる回答である必要があります! – jpatokal

1

あなたはIOとして全体の時間(無配列の変換を)ファイルを維持したいとあなたが最初の行にデータを使用する予定がある場合:

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

より可能性が高いものの、何を望むので扱われますCSV、またはFasterCSVを使用しています。ヘッダ行を使用してファイルを処理するための私のお気に入りの方法が行うことです。

FasterCSV.table('users.txt') 
1

いくつかの答え(もはやは?)Rubyの1.9.3で動作していないので、ここでは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 
のワーキングサンプル
関連する問題