0

一部のファイル属性をインポートする rake タスクを実行していますが、各行に作成された文字列に何らかの改行文字 (例: /n) が含まれていると思われるエラーが表示されます。

編集- 改行文字が問題であることが確認されています。

これは、私の CSV ファイルがどのように見えるかのサンプルです。

1|type1,type2|category1
2|type2|category1,category2,category3
3|type2,type4|category3,category8

そして、これに対処するための私のコードは次のとおりです。

namespace :data do
  desc "import"
  task :import => :environment do
    file = File.open(Rails.root.join('lib/assets/data.csv'), 'r')
    file.each do |line|
      attrs = line.split("|")
      foo = Model.find(attrs[0])

      attrs[1].split(",").each do |type|
        foo.add_type!(ModelType.find_by_name(type))
      end

      attrs[2].split(",").each do |category|
        foo.categorize!(ModelCategory.find_by_name(category))
      end
    end
  end
end

ModelTypeとは、関数とで構築された との関係をModelCategory持つ両方の別個のモデルです。:throughModelModel.add_type!Model.categorize!

を実行すると、最初の行の最後に到達rake data:importするまで、すべて正常に動作します。categoryそれがどのカテゴリであるか、またはいくつのカテゴリに存在するかは関係ありませんattrs[2]-最後のカテゴリでのみ失敗します。これは私が受け取るエラーです:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

これを修正する方法、またはこのエラーを回避する方法について何か考えはありますか?

4

3 に答える 3

2

chomp を使用できます。

attrs = line.chomp.split("|")
于 2012-05-01T22:44:19.320 に答える
0

String.encode(universal_newline: true)代わりに gsubを使用してください。CRLF と CR を LF に変換します # 常に \n で改行します

于 2014-12-31T07:39:57.267 に答える
0
attrs = line.split("|")
if attrs.length > 0
  foo = Model.find(attrs[0])
  ...
end

CSV の最後に空の行がある可能性があります。

アップデート

file = File.open(Rails.root.join('lib/assets/data.csv'), 'r')
file.split("\r\n").each do |line|

また

file = File.open(Rails.root.join('lib/assets/data.csv'), 'r')
file.split("\r").each do |line|

また

file = File.open(Rails.root.join('lib/assets/data.csv'), 'r')
file.split("\n").each do |line|

CSV が最初にどのように生成されたかによって異なります。

于 2012-05-01T22:26:19.777 に答える