2013-12-08 20 views
14

Ho diversi file che vengono salvati come tsv. Voglio inserirli in un db postgresql, per analizzarli con sql.Inserire i file `tsv` in postgresql db

Tuttavia, il mio problema è come fare a INSERT questo file tsv in postgresql 9.2 in windows 7?

Apprezzo la tua risposta!

PS .: Ho creato la tabella con i valori giusti come:

CREATE TABLE ratings (distribution VARCHAR, votes VARCHAR, rank FLOAT, title VARCHAR);

il file si trova nella directory:

C:/Users/testUser/Desktop/TSV/ratings.list.tsv

+1

TSV come in vettori di ricerca di testo, o volevi dire csv come in virgola valori separati? Se quest'ultimo, utilizzare COPY. –

+0

@Denis Thx per la tua risposta. Con tsv intendo valori tab separati. Potresti mostrare un esempio su come usare COPY in una istruzione sql. – mrquad

risposta

13

Per valori separati scheda, è possibile utilizzare la copia:

http://www.postgresql.org/docs/current/static/sql-copy.html

A seconda del formato esatto del file, potrebbe essere qualcosa di simile:

COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER '\t' 
+4

Thx per la tua risposta. L'ho provato immediatamente, ma ho ottenuto: 'ERRORE: DELIMITER per COPY deve essere un singolo carattere di un byte' – mrquad

+3

ok risolto ho dovuto digitare una scheda invece con' \ tab'. Grazie per il tuo aiuto! – mrquad

+2

\ t - la scheda è predefinita, quindi in questo caso non è necessario utilizzare DELIMITER –

2

Triste a dirsi, ma il modo più semplice è quello di convertire il TSV in un file CSV. La maggior parte delle utilità di importazione Postgres incorporate per eseguire operazioni come convertire stringhe vuote in null, saltare intestazioni, ecc. Sono Solo per CSV.

Vedere questo semplice 6 line Python answer on SO. Lo uso e poi CSV viene caricato come di consueto senza problemi in Postgres dopo aver provato e ora di caricare un TSV.

+0

Grazie per il voto di download. Per vari casi d'uso, la risposta di upvoted non funzionerà, da qui il suggerimento di cui sopra.;) –

12

Volete qualcosa di simile:

COPY ratings FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' DELIMITER E'\t'; 

Il E'\t' è necessario, altrimenti si otterrà un errore come questo:

ERROR: DELIMITER for COPY must be a single one-byte character


Se le colonne nel TSV don' t allinea perfettamente con il tuo tavolo, puoi anche definire il mapping nel modo seguente:

COPY ratings (column_1, column_2, ... column_n) 
    FROM 'C:/Users/testUser/Desktop/TSV/ratings.list.tsv' 
    DELIMITER E'\t'; 
+0

se aggiungi CSV alla fine, puoi anche utilizzare il flag HEADER – kdazzle

1

Sono in grado di farlo con csvsql da csvkit.

Per leggere un TSV (o CSV) e creare/inserire a un tavolo, il mio script da riga di comando è simile al seguente:

csvsql --insert input.tsv --table table_t --tabs --no-constraints --db postgresql://user:[email protected]/mydb 
Problemi correlati