2012-12-26 5 views
8

Sto cercando di importare i dati da un file .csv in un database postgresql 9.2 utilizzando il comando psql \COPY (non lo SQL COPIA).Importazione di .csv con la colonna timestamp (gg.mm.aaaa hh.mm.ss) utilizzando psql copy

Il file .csv di input contiene una colonna con un timestamp nel formato gg.mm.aaa hh.mm.ss.

Ho impostato lo datestyle del database su DMY utilizzando.

set datestyle 'ISO,DMY' 

Purtroppo, quando si esegue il comando \COPY:

\COPY gc_test.trace(numpoint,easting,northing,altitude,numsats,pdop,timestamp_mes,duration,ttype,h_error,v_error) 
FROM 'C:\data.csv' WITH DELIMITER ';' CSV HEADER ENCODING 'ISO 8859-1' 

ottengo questo errore:

ERROR: date/time field value out of range: "16.11.2012 07:10:06"

HINT: Perhaps you need a different "datestyle" setting.

CONTEXT: COPY trace, line 2, column timestamp_mes: "16.11.2012 07:10:06"

Cosa c'è di sbagliato con il datestyle?

risposta

7

Hai provato a impostare il datestyle setting of the server?

SET datestyle = 'ISO,DMY'; 

Si utilizza il meta-comando di psql \copy, il che significa che il file di input è locale al client. Ma è ancora il server che deve forzare l'input per abbinare i tipi di dati.

Più in generale, a differenza del psql meta-comando \copy che richiama COPY sul server ed è strettamente correlata ad esso .. Cito the manual concerning \set:

Note: This command is unrelated to the SQL command SET.

+0

Grazie per il vostro aiuto. Ho modificato la configurazione manualmente su datestyle = 'iso, dmy' nel file postgresql.conf e l'importazione funziona bene ora. Non sono sicuro se questo è quello che stai suggerendo. Sto comunque cercando un modo per impostare il datestyle del server con un comando psql. – jatobat

+1

Bene, modificare postgresql.conf è un modo radicale per farlo. È anche possibile emettere il comando SQL come indicato nella sessione prima di eseguire '\ copy'. Quindi l'impostazione viene modificata solo per quella sessione. –

+0

Ho provato a eseguire l'insieme di 'set datestyle = 'ISO, DMY';' comando SQL nell'editor (prima di modificare il file postgresql.conf) e quindi l'esecuzione di psql \ copy, ma ho ricevuto lo stesso errore di prima. – jatobat

2

ho trovato difficile da applicare 'datestyle SET' all'interno la stessa sessione quando si applica il comando psql. Alterare il datestyle sull'intero database/server (solo per l'importazione) potrebbe anche causare effetti collaterali su altri utenti o applicazioni esistenti. Quindi di solito modifico il file stesso prima del caricamento:

#!/bin/bash 
# 
# change from dd.mm.yyyy to yyyy-mm-dd inside the file 
# note: regex searches for date columns separated by semicolon (;) 
sed -i 's/;\([0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9][0-9][0-9]\);/;\3-\2-\1;/g' myfile 
# then import file with date column 
psql <connect_string> -c "\COPY mytable FROM 'myfile' ...." 
0

Lo stile di data che sembra utilizzare è il tedesco. PostgreSQL supporta questo stile di data. Prova a utilizzare questo:

SET datestyle TO German; 
Problemi correlati