簡體   English   中英

使用psql \\ copy導入csv,修改數據

[英]importing csv with psql \copy, modify data as it comes

我經常需要將csv導入postgres,並且通常使用psql\\copy命令。 通常看起來像這樣

\copy tbl FROM import.csv CSV 

我有兩個常見的問題,我認為可能會有類似的答案。

  1. 將日期字符串輸入到TIMESTAMP字段中時進行解析
  2. 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 根據您的確切需求,可能更容易推理和/或開銷更少。

例如,您可以使用Pythoncsvpsycopg2模塊分別與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM