2012-09-17 96 views
2

我想通過COPY FROM將文本數據加載到postgresql數據庫中。數據絕對不乾淨CSVCOPY FROM COPY FROM tolerantly consume bad CSV?

輸入數據並不總是一致的:有時會出現多餘的字段(分隔符是字段內容的一部分),或者在整數字段中存在空值而不是0。

結果是PostgreSQL拋出一個錯誤並停止加載。

目前我正試圖通過perl將數據按摩到一致性。

有沒有更好的策略?

是否可以要求PostgreSQL與一樣寬容mysqlsqlite在這方面?

感謝

回答

1

PostgreSQL的COPY FROM是不是設計來處理bodgy數據,是相當嚴格的。幾乎沒有支持容忍數據丟失的問題。

我以爲有沒有興趣添加任何東西,直到我看到this proposed patch就在幾天前發佈可能包含在PostgreSQL 9.3中。該補丁已被完全拒絕,但表明這個想法有一些興趣;讀線程。

有時可能將COPY FROM轉化爲具有所有text字段且沒有約束的登臺TEMPORARY表。然後你可以從那裏使用SQL來處理數據。這隻會在SQL至少格式良好且規則時才起作用,而且聽起來不像你的。

如果數據不乾淨,則需要使用適當的腳本語言的腳本預處理它。

有腳本:

  • 連接到PostgreSQL和INSERT行;
  • 連接到PostgreSQL並使用腳本語言的Pg API到COPY行;或
  • 寫出乾淨CSV,你可以COPY FROM

Python的csv模塊可以很方便這一點。你可以使用任何你喜歡的語言; perl,python,php,Java,C等等。

如果你很熱心,你可以寫在PL/PerluPL/Pythonu,在讀取數據時插入數據並清理它。我不打擾。