2012-10-02 48 views
2

我試圖從csv文件導入到postgresql的數據,不幸的是它沒有完全格式化。Postgresql - 將csv導入到時間戳的合併時間和日期

例子:

DATE,TIME,NUMERIC,NUMERIC,NUMERIC,NUMERIC,INTEGER 

我希望將數據導入到表中的列:

timestamp with timezone, numeric, numeric, numeric, numeric, integer 

對於導入我用複製的數據:

COPY tabledata FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV; 

當然它不起作用,因爲日期和時間被','分開,所以postgresql假定這些是2個獨立的數據領域。

我已經管理它將.csv導入到一個設置爲.csv的表格中,但是我需要將日期和時間作爲時間戳,稍後使用時區,因爲我將處理大量的數據後導入轉換將是我的最後選擇,因爲性能問題。

我試圖編輯.csv文件,然後導入「sed's /,/ /'EURUSD30.csv> EURUSD30E.csv」,但是我得到一個錯誤,提示命令「s /」是輸入錯誤或無法找到。我很笨,因爲這似乎適用於其他人,但這也不是我的第一選擇。

如果postgresql在導入時可以簡單地告知將時間和日期合併到一個時間戳值中,那將會更容易。有任何想法嗎?

感謝

+0

複製命令沒有任何改變數據的能力。如果您希望在導入時執行此操作,則可以嘗試向表中添加一個觸發器,在每行插入併合並列後觸發該表。不幸的是,最終,這並不比導入後的操作更好。您最好的選擇是在導入之前清理CSV文件。 – jcern

回答

3

你最好的賭注是COPY數據到TEMPORARYUNLOGGED表,並從那裏做一個:

INSERT INTO real_table 
SELECT col1, col2, col3, datecol + timecol, col6, ... 
FROM temp_copy_table; 

你可以做任何其他所需的數據在這個過程太按摩。

合併時考慮時區。 DATE + TIME產生timestamp without time zone

regress=# SELECT pg_typeof(DATE '2012-02-01' + TIME '10:00'); 
      pg_typeof   
----------------------------- 
timestamp without time zone 
(1 row) 

,你可能要存儲與時區的時間戳,所以你可能想告訴PG解釋日期+時間在特定時間區帶爲:

(datecol + timecol) AT TIME ZONE 'UTC' 

或任何當地時區的時間戳。

+0

這對我的測試數據集完美無缺,謝謝! – harbun