![](/img/trans.png)
[英]Importing csv with json value with psql COPY (problem with escaping)
[英]importing csv with psql \copy, modify data as it comes
我經常需要將csv導入postgres,並且通常使用psql
的\\copy
命令。 通常看起來像這樣
\copy tbl FROM import.csv CSV
我有兩個常見的問題,我認為可能會有類似的答案。
TIMESTAMP
字段中時進行解析 INTEGER
字段中的空字符串導致錯誤 在這兩種情況下,都需要進行較小的修改,但是我當前的解決方案是創建所有字段都為VARCHAR
類型的加載表,然后使用正確的架構創建另一個表。 然后,我使用\\copy
和
CREATE TABLE loading_tbl (
datefield VARCHAR,
integerfield VARCHAR
);
CREATE TABLE tbl (
datefield TIMESTAMP,
integerfield INTEGER
);
\copy loading_tbl FROM import.csv CSV
INSERT INTO tbl (datefield, integerfield)
SELECT
to_timestamp(datefield, 'YYYY-Mon, DAY HH24:MI a.m'),
integerfield::INTEGER
FROM loading_tbl;
DROP TABLE loading_tbl;
這是最好的方法還是更簡單的方法? 創建兩個表有點麻煩,尤其是隨着字段數的增加。
另一種選擇是使用腳本語言來執行ETL 。 根據您的確切需求,可能更容易推理和/或開銷更少。
例如,您可以使用Python的csv和psycopg2模塊分別與CSV文件和Postgres數據庫進行交互,執行任何必要的ETL 。 通常, psycopg2將為您處理時間戳字符串到實際的Postgres時間戳轉換(假定它是一個公認的時間戳字符串,其中有多種類型)。
對於CSV中的字段(在Postgres中為整數但在CSV中為空字符串)的情況,在Python腳本中,您可以檢查空字符串值,然后在Postgres中將其分配為NULL 。
我最近用Python做過類似的事情,效果很好。 解決該問題的最大方法可能是不需要過渡表,因為ETL可以在腳本中完成,然后通過psycopg2發送到Postgres 。
如果您的ETL需求適中,即僅限於上面提供的示例,那么純SQL可能值得堅持。 對此的一種增強是使用temp table
(用於loading_tbl
)而不是常規表。 這樣,您就不必擔心在ETL處理數據后將其刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.