2012-10-24 31 views
0

我解析一个TSV文件并将其加载到MySQL中。我得到了这个工作,然后发现TSV文件中有反斜杠被解释为换行符。我想在数据发送到数据库之前从所有字段中删除\。这是一个简短的例子,文件中有300列,其中许多列将是空白的。如何在解析过程中从tsv文件中删除字符?

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 

当我运行这个例子时,我得到一个错误:未定义的方法`gsub'为nil:NilClass。我认为这个错误是由文件中的空白产生的。然而,当我尝试添加

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

它不会执行,我得到一个意外的错误}。

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

感谢

+0

感谢@Levi这是工作。一个注意事项是,要删除的角色竟然是一个选项卡。在这种情况下,我需要将映射函数移到CSV块之外,以便在执行col_sep之前进行处理。 – analyticsPierce

回答

1

unless声明应遵循的其他代码。这就是导致第二个错误的原因。试试这个:

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 
+0

很好的答案。谢谢。我该如何设置它,以便空白保持空白?这将被插入到数据库中,我宁愿查询NULL。 – analyticsPierce

+0

为您增加了更多信息。 – 2012-10-25 14:03:13

+0

效果很好。谢谢! – analyticsPierce