2013-08-19 11 views
1

我有一個相當大的CSV文件,我需要偶爾導入到PostgreSQL數據庫中,但它幾乎總是包含太多的錯誤以便使用SQL COPY導入命令。我已經設法通過使用awk命令來解決引號存在問題:使用linux命令清理CSV文件,同時忽略引號之間的逗號

awk -F \''NF%2 == 1 {print $ 0}'。 /db_downloaded.csv> ./db_sanitized.csv

這種下降是有奇數個就可以了引號任何行,工作得很好。我遇到的另一個常見問題是與列的數量不正確。我目前解決這個問題的方法是使用下面的awk命令刪除所有含有錯誤數字的行:

的awk -F 「」 'NF == 40 {打印$ 0}' ./db_sanitized.csv> ./db_sanitized2.csv

然而,這使得它丟棄有引號之間的逗號任何行,這是實際上不少行。現在,導入每一行都不那麼重要,但如果我有一種方法可以只計算一行中不出現在引號之間的逗號,我真的很喜歡它。我能想到的唯一方法是做一些布爾變量,每當流中有一個引號時就會翻轉,這會關閉檢查逗號,但我不確定如果我是從哪裏開始要做到這一點。

我最感興趣的是使用像grep,awk,tr等linux命令,我可以在遠程服務器上運行,而不是編寫自己的C++程序,但如果沒有另一種方式。

編輯:我結束了使用此Ruby腳本:

lines = File.new("/home/db/product_list.csv", "r") 
sanitized = File.new("/home/db/product_list_sanitized.csv", "w") 

lines.each do |l| 
    if l.count("\"") % 2 == 0 
    if l.count(",") > 39 
     u = true 
     commas = 0 
     l.each_char do |c| 
     if (c == "\"") 
      u = (not u) 
     elsif (u && (c == ",")) 
      commas += 1 
     end 
     end 
     sanitized.write(l) if commas == 39 
    else 
     sanitized.write(l) 
    end 
    end 
end 

sanitized.close 
+0

你可以看看[csvfix(http://code.google.com/p/csvfix),但更多的是對操縱合式CSV比固定起來格式不正確的CSV。您是否無法獲得據稱是CSV文件的提供者來修復其數據生成中的錯誤? –

+0

實際上,我最終通過使用ruby腳本逐行讀取我的CSV文件,使用奇數個逗號和不正確的逗號數字來挑選行,然後逐字節地遍歷這些行,每次切換布爾值時間發現一個引號。如果布爾值爲「true」,那意味着逗號介於引號之間。 – virnovus

+0

修復錯誤的CSV確實需要類似於Ruby的東西 - 我會使用Perl,Python也可以,而且Ruby是有意義的,如果這就是您使用的方式。解決一團糟真的很難;您應該開展廣告系列以獲取發送給您的乾淨的CSV文件。 –

回答

0

藏匿原線,以更加乖巧令牌替換引號的所有集合,並覈對;打印原稿是否匹配:

awk -F, '{line=$0;gsub(/"[^"]*"/,"x")}NF%2{print line}' test.in 
+0

我實際上使用了一個ruby腳本來修復它,這最終不會成爲一個問題,因爲我需要爲其他東西使用ruby腳本。 – virnovus

相關問題