2011-06-06 25 views
6

我是Postgresql的新手,努力構建一個循環處理一系列CSV文件並加載它們的函數。我可以使用單個文件使COPY工作正常,但我無法使FOR LOOP語法正確。我試圖取代我的蒼蠅被命名爲/path/tmp.YEAR.out.csvplpgsql:將變量連接到FROM子句中

一年數字。這就是我砍死了:

CREATE OR REPLACE FUNCTION test() RETURNS void as $$ 
BEGIN 
    FOR i IN 1982..1983 LOOP 
    COPY myTable 
    FROM '/path/tmp.' || i::VARCHAR || '.out.csv' 
    delimiters ',' 
    END LOOP; 
END; 
$$ LANGUAGE 'plpgsql'; 

這在拋出一個錯誤第一||。所以我懷疑我不正確地管理變量i的連接。有小費嗎?

+0

我們是否允許添加'r'標籤並以此方式解決? – 2011-06-06 21:47:58

+0

我當然想過......但我需要快速加載postgresql COPY命令......我有幾十個文件〜500MB。 – 2011-06-06 21:51:24

+0

@dirk,如果我在R中查詢字符串,我可以提交它作爲查詢嗎?我想我只能用普通的sql來做,而不是plpgsql,所以我甚至沒有嘗試。 – 2011-06-06 22:10:02

回答

6
CREATE OR REPLACE FUNCTION test() RETURNS void as $$ 
BEGIN 
FOR i IN 1982..1983 LOOP 
    EXECUTE 'COPY myTable FROM ''/path/tmp.' || i::text 
              || '.out.csv'' DELIMITERS '',''; '; 
END LOOP; 
END; 
$$ language plpgsql; 
+0

謝謝Seth。我確信這與解析事情並按照正確的順序放在一起有關。我當然不會在沒有幫助的情況下解碼。 – 2011-06-06 21:55:45

5

我不認爲我會爲此使用plpgsql。 shell腳本可能會更加普遍有用:

#!/bin/sh 

DBHOST=mydbhost 
DBNAME=mydbname 

files=$1 
target=$2 

for file in ${files}; do 
    psql -h ${DBHOST} ${DBNAME} -c "\copy ${target} FROM '${file}' delimiters ','" 
done 

用法示例:

csv2psql "$(ls *.out.csv)" someschema.tablename 

注:這樣你也迴避的讀取與複製文件的問題,這需要Postgres的服務器用戶已經閱讀文件權限。

+1

使用psql \ copy命令我可以用任何語言來包裝它,實際上。漂亮的方法。謝謝! – 2011-06-07 11:48:26