2011-06-06 25 views
6

Postgresql uygulamasında yeniyim ve bir dizi CSV dosyası üzerinde döngü yapmak ve bunları yüklemek için bir işlev oluşturmaya çalışıyorum. COPY'yi tek bir dosyayla gayet iyi yapabilirim, ancak FOR LOOP sözdizimini doğru olarak alamıyorum.plpgsql: FROM yan tümcesine birleştirme sonucu

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'; 

Bu bir hata atıyor: Ben bu ben kesmek şey bu benim sinekler /path/tmp.YEAR.out.csv

adlandırılır olarak yılda numarasını yerine çalışıyorum ilk || Bu yüzden, i değişkeninin uyumsuzluğunu hatalı şekilde yönetdiğimden şüpheliyim. Herhangi bir ipucu?

+0

'r' etiketi ekleyip bu şekilde çözmemize izin var mı? –

+0

Bunu kesinlikle düşündüm ... ama postgresql COPY komutunun hızlı yüklenmesine ihtiyacım vardı ... Birkaç tane düzine dosyam var ~ 500MB. –

+0

@ dkk, R sorgusu dizgesini döndürürsem sonra sorgu olarak gönderebilir miyim? Ben sadece plpgsql değil, düz sql ile yapabileceğini düşünüyordum, bu yüzden denemedim. –

cevap

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

Teşekkürler Seth. Bunun, ayrıştırılmış şeyleri bir araya getirip doğru sırayla bir araya getirilmesiyle ilgili olduğundan eminim. Bunu yardımsız olarak çözemezdim. –

5

Bunun için plpgsql kullanacağımı düşünmüyorum.

#!/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 

örnek kullanım:

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

Not: postgres sunucusu kullanıcı gerektirir ayrıca KOPYASINI ile dosya okuma problemini kaçınmak Bu şekilde okumuş A kabuk komut dosyası çok daha genel olarak yararlı olabilir dosyadaki izinler.

+1

psql \ copy komutunu kullanarak bunu aslında herhangi bir dilde yazabilirim. Şık bir yaklaşım. Teşekkürler! –

İlgili konular