2015-08-08 64 views
0

我目前正在努力清理使用sed或awk或腳本使用包含csv分隔符和字段分隔符的字段自動生成的csv文件。如何清潔csv文件,其中字段包含csv分隔符和分隔符

源軟件沒有設置可以改善情況。

格式的CSV格式:

"111111";"text";"";"text with ; and " sometimes "; or ;" multiple times";"user"; 

幸運的是,CSV是「好」的格式,出口軟件只是不逃避或更換從田間地頭「禁止」字符。

在過去的幾天中,我試圖提高我對正則表達式的瞭解,並發現表達式來清理文件,但是我失敗了。

我設法到目前爲止做:

正則表達式來查找場(我想找到的領域和進行內部更換,但我沒有找到一個方法來做到這一點)

(?:";"|^")(.*?)(?=";"|";\n) 

找到分號的正則表達式,如果分號是字段的最後一個字符只在每個字段中找到一個,則不起作用。

(?:^"|";")(?:.*?)(;)(?:[^"\n].*?)(?=";"|";\n) 

正則表達式來尋找雙引號,似乎挑線的第一個雙引號在網上正則表達式測試

(?:^"|";")(?:.*?)[^;](")(?:[^;].*?)(?=";"|";\n) 

我想在田裏每個字符之間增加空間然後孤獨搜索的半冒號和雙引號,然後刪除單個空間,但我不知道這是否可能,反正看起來像一個糟糕的解決方案。

回答

0

如果CSV本身沒有明確的錯誤,任何標準庫都應該能夠處理它。這就是爲什麼我們有引號字符和轉義字符。

當您自己創建CSV時 - 您可能會忘記處理這種情況,並讓您的最終輸出文件使用這種情況。 AWK不是一個CSV閱讀器,而只是一個文本處理工具。

這是你的行應該看起來像什麼。

"111111";"text";"";"text with \; and \" sometimes \"; or ;\" multiple times";"user"; 

所以,如果你仍然可以重新讀取數據,找到一種方法,在CSV或者通過數據庫自身的CSV庫的功能,爲你一起工作的語言輸出。

在Python中,這應該是這樣的: -

mywriter = csv.writer(csvfile, delimiter=';', quotechar='"', escapechar="\\") 

但是,如果你不能再創建CSV,唯一的希望是,你所期望的領域內的一些模式,在這個問題: - parse a csv file that contains commans in the fields with awk

但是在文本數據中很少出現這種情況 - esp評論或網頁上的帖子。在這種情況下的另一個想法是使用'\ t'作爲分隔符。

+0

感謝您的回答。 很遺憾,我無法更改軟件的輸出,也無法訪問它的數據庫。並且字段是由用戶鍵入的註釋,其中沒有模式。 我需要加載這個數據到一個mysql數據庫,我使用「加載數據infile」函數,它無法處理這些記錄。 –

+0

你是如何得到這些數據的?您絕對可以請求負責處理數據的人員使用其他分隔符(如\ t)或使用轉義字符來確保格式正確。您必須簡單地通知他們數據不是可分析的。 – Aditya

+0

只有導出的行和列完全無法控制csv格式。我會更多地關注awk函數。從你的鏈接中我知道你可以使用正則表達式作爲awk的字段分隔符,我認爲只有一個字符是可能的。再次感謝。 –