2016-03-05 59 views
0

我遇到了將一些CSV文件加載到我的Postgres表中的問題。我有一個看起來像這樣的數據:將CSV數據加載到Postgres時使用哪個分隔符?

ID,IS_ALIVE,BODY_TEXT 
123,true,Hi Joe, I am looking for a new vehicle, can you help me out? 

現在,這裏的問題是,什麼是應該的文字是BODY_TEXT列是非結構化的電子郵件數據,可以包含任何類型的字符,當我運行在COPY命令後面,因爲在BODY_TEXT內有多個,個字符,所以它失敗。

COPY sent from ('my_file.csv') DELIMITER ',' CSV; 

我怎樣才能解決這個如此,在BODY_TEXT列一切都被加載,是不使用其內部字符作爲分隔符加載命令可能?

+3

問題不在於加載命令 - 它與文件。 CSV不允許在一個字段內使用逗號(它將值分成兩個字段),除非它受引號保護('''s) – Mureinik

+0

您應該使用另一個分隔符值 – Patrick

回答

1

除了修復源文件格式,你可以通過PostgreSQL本身來完成。

從文件加載到臨時表中的所有行:

select regexp_matches(x, '^([0-9]+),(true|false),(.*)$') from t; 

           regexp_matches        
--------------------------------------------------------------------------- 
{123,true,"Hi Joe, I am looking for a new vehicle, can you help me out?"} 
{456,false,"Hello, honey, there is what I want to ask you."} 
(2 rows) 

您可以使用此查詢將數據加載到目標表:

create temporary table t (x text); 
copy t from 'foo.csv'; 

然後你可以使用正則表達式像分割每個字符串:

insert into sent(id, is_alive, body_text) 
    select x[1], x[2], x[3] 
    from (
    select regexp_matches(x, '^([0-9]+),(true|false),(.*)$') as x 
    from t) t 
相關問題