2012-10-24 27 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