15

私はrubyのファイルを使用して、rakeタスク内のテキストファイルを開いて読み込みます。ファイルの最初の行をスキップするように指定できる設定はありますか?これまでの私のコードは次のとおりです。

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ましたが、運がありませんでした。

4

8 に答える 8

22

に変更eachするeach_with_index do |line, index|next if index == 0機能します。

于 2012-03-08T08:16:30.293 に答える
20

関数は最初から行drop(n)を削除nします:

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

nファイル全体を配列に読み込み、最初の行を削除します。とにかくファイル全体を読んでいるなら、それはおそらく最もエレガントな解決策です。

于 2013-02-04T14:10:49.697 に答える
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

列挙子を利用します。列挙子は、それがどこにあるかを「記憶」します。

于 2012-03-08T08:21:08.013 に答える
4
File.readlines('users.txt')[1..-1].join()

うまくいきます。

于 2012-12-27T19:42:40.350 に答える
4

あなたはおそらく本当にcsvを使いたいでしょう:

CSV.foreach("users.txt", :headers, :header_converters => :symbol, :col_sep => ',') do |row|
  User.new(row).save
end 
于 2012-03-08T08:49:49.447 に答える
1

ファイルを常にIOとして保持し(配列変換なし)、最初の行のデータを使用する予定の場合:

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

ただし、他の人が指摘しているように、必要なものはCSVまたはFasterCSVで処理される可能性が高くなります。ヘッダー行のあるファイルを処理する私のお気に入りの方法は、次のことです。

FasterCSV.table('users.txt')
于 2013-05-01T23:16:37.250 に答える
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
于 2014-10-29T16:48:45.803 に答える
0

OPはlineno彼らにはうまくいかなかったと言ったが、それは正しい方法で適用されなかったと私は推測している。OPが求めていることを実現する方法はたくさんありますが、を使用すると、linenoを使用せずにコードを短縮できる場合readlinesがあります。これは、メモリを大量に消費する場合があります。

1.9.3ドキュメントから

f = File.new("testfile")
f.each {|line| puts "#{f.lineno}: #{line}" }

生成:

1: This is line one
2: This is line two
3: This is line three
4: And so on...

これはファイルオブジェクトから呼び出すことができるメソッドですが、ブロックに渡されたオブジェクトではないことに注意してください。

   2:     require 'pry'; binding.pry
=> 3:   f.each {|line| puts line.lineno }

[1] pry(#<SomeFile>)> line.lineno
NoMethodError: undefined method `lineno' for #<String:0x00007fa7d682b920>

今日のRubyの最新の安定バージョン(2.5.1)のドキュメントで、同じコードを使用した同じを見つけることができます。

したがって、例を外すと、コードは次のようになります。

f = File.new("testfile")
o = File.open("output.txt", w)
f.each do |line|
  next if f.lineno == 1
  o << line
end
于 2018-08-17T00:59:17.323 に答える