Ruby on rails 3 如何在解析期间从tsv文件中删除字符?

Ruby on rails 3 如何在解析期间从tsv文件中删除字符?,ruby-on-rails-3,Ruby On Rails 3,我正在解析一个tsv文件并将其加载到MySQL中。我得到了这个工作,然后发现在tsv文件中有反斜杠被解释为换行符。在将数据发送到数据库之前,我希望从所有字段中删除\。这是一个缩短的示例,文件中有300列,其中许多列将为空 begin CSV.foreach(file, :col_sep => "\t") do |row| row.map!{ |e| e.gsub(/\\/, '')} d = Datafeed.new d

我正在解析一个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(/\\/, '') } 
它将不会执行,并且我得到一个意外的}错误

这是消除后斜线的正确方向吗?最好的方法是什么


谢谢

除非语句应该跟在其他代码后面。这就是导致第二个错误的原因。试试这个:

row.map!{ |e| e.gsub(/\\/, '') unless e.blank? }
注意:该代码将把
变成
nil
,这可能是您所期望的,也可能不是您所期望的

你的方法似乎是合理的

编辑:

要保留空白,可以执行以下操作:

row.map!{ |e| e.blank? ? '' : e.gsub(/\\/, '') }
或者,如果一行对您来说有点太多,那么:

row.map! do |e|
  if e.blank?
    ''
  else
    e.gsub(/\\/, '')
  end
end

回答得很好。非常感谢。我如何设置它使空白保持空白?这将被插入到数据库中,我希望查询空值。为您添加了一些更多信息。感谢@Levi,这是有效的。需要注意的是,要删除的字符原来是一个制表符。在这种情况下,我需要将映射函数移到CSV块之外,以便在执行:col_sep之前进行处理。