0

tsvファイルを解析してMySQLにロードしています。これを機能させたところ、tsvファイルに改行として解釈されているバックスラッシュがあることがわかりました。データがデータベースに送信される前に、すべてのフィールドから\を削除したいと思います。これは短縮例です。ファイルには300列あり、それらの多くは空白になります。

begin              
  CSV.foreach(file, :col_sep => "\t") do |row|
      row.map!{ |e| e.gsub(/\\/, '')} 
      d = Datafeed.new
      d.id = row[0]
      d.description = row[1]
      d.save!
  end
end

この例を実行すると、エラーが発生します。nil:NilClassの未定義のメソッド`gsub'です。このエラーは、ファイル内の空白によって生成されていると思います。ただし、追加してみると

row.map!{ |e| unless e.blank e.gsub(/\\/, '') } 

実行されず、予期しない}のエラーが発生します。

これは、バックスラッシュを削除するための正しい方向ですか?最善のアプローチは何ですか?

ありがとう

4

1 に答える 1

1

unlessステートメントは他のコードに従う必要があります。それが2番目のエラーの原因です。これを試して:

row.map!{ |e| e.gsub(/\\/, '') unless e.blank? }

注:そのコードは、期待どおりのコードになる""場合nilとそうでない場合があります。

あなたのアプローチは合理的なようです。

編集:

空白を保持するには、次のようにします。

row.map!{ |e| e.blank? ? '' : e.gsub(/\\/, '') }

または、それが1行に対して少し多すぎる場合は、次のようにします。

row.map! do |e|
  if e.blank?
    ''
  else
    e.gsub(/\\/, '')
  end
end
于 2012-10-25T00:51:11.093 に答える