2011-12-01 35 views
16

Estoy tratando de importar un archivo CSV en PostgreSQL usando COPY. Se bloquea cuando llega a una fila donde hay valores vacíos, p. la segunda fila de abajo:Copia de PostgreSQL desde CSV con valores de datos faltantes

JAN-01-2001,1,2,3,4,5

JAN-02-2001,6,7,,,

He intentado esta declaración COPIA, así como las variantes usando NULL y CITA y havent encontrado nada que funcione.

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

¿Alguna sugerencia? El archivo de datos se encuentra en un archivo plano de 22 GB masivo, por lo que me gustaría evitar editarlo directamente.

+2

Y el error es? –

+1

Eso no es historia completa. De acuerdo con [documentación] (http://www.postgresql.org/docs/8.3/static/sql-copy.html) y mi caso de verificación de arriba funciona bien bajo cualquier PostgreSQL moderno (valor vacío sin comillas en modo CSV). Tal vez usted no tiene modificador NULL o número inválido de comas? –

+0

ERROR: sintaxis de entrada no válida para tipo numérico: CONTEXTO: datos COPY, línea 13, columna interval_2400: – ugh

Respuesta

2

Sugeriría convertir sus columnas numéricas en columnas de texto para los fines de su importación. La razón es que una cadena vacía no es un valor numérico válido. Cambie sus columnas numéricas a columnas de texto, importe el archivo CSV, actualice los valores vacíos a cero o 0, y luego cambie la columna a un número entero.

+0

En formato CSV, nada entre los delimitadores significa 'NULL', no una cadena vacía, que es la sintaxis válida para un valor numérico. Las cadenas vacías se escriben como comillas dobles vacías: '" "'. –

+0

Si alguien como yo se confunde con el útil comentario de Erwin sobre cadenas vacías que significan espacios en blanco en archivos CSV, estaba usando un archivo de texto (TSV) ... es un símbolo diferente para los valores en blanco: '\ N'. – Sigfried

2

con una pregunta como esa debe siempre incluir información sobre su sistema operativo y número de versión de PostgreSQL.

Su afirmación es sospechoso:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV; 

DELIMITERS se utilizó en las versiones 7.3 antes. Todavía es compatible con el fin de no romper el código anterior, pero no lo use más. La palabra clave adecuada es DELIMITER. Y no es necesario que especifique ,, ya que es el predeterminado para FORMAT CSV.
Además, cito el manual here:

filename

The absolute path name of the input or output file. Windows users might need to use an E'' string and double any backslashes used in the path name.

lo tanto, su 'data.dat' debería ser algo así como '/path/to/data.dat' en UNIX o E'C:\\path\\to\\data.dat' en Windows.

Para las versiones 7.3+ utilizan:

COPY data FROM '/path/to/data.dat' CSV 

Para las versiones 9.0+ uso:

COPY data FROM '/path/to/data.dat' (FORMAT CSV) 

Si continúa recibiendo este error:

ERROR: invalid input syntax for type numeric: CONTEXT: COPY data, line 13, column interval_2400:

Entonces, obviamente, , el archivo de origen no coincide con la estructura de tabla data. Eche un vistazo a su archivo fuente, vaya a la línea 13 y vea qué valor hay para la columna interval_2400. Lo más probable es que no sea numérico. Usted puede fijar el archivo de origen oadaptar la definición de la tabla:

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text; 

o lo que escribir es más apropiado. Podría ser interval, a juzgar por el nombre.

+0

PostgreSQL 9.1.1, MacOSX 10.7.2. Como mencioné anteriormente, la importación funciona bien para las primeras 12 líneas del archivo. Las columnas son de hecho numéricas y coinciden con la definición de la tabla. Es solo que algunas filas tienen valores faltantes. – ugh

+0

@ user1076175: edite su pregunta con las primeras 15 filas de su archivo de datos. También ponga la información de la versión en su pregunta (no en un comentario a mi respuesta). –

+0

El principal problema es el de la csv corrupta, por supuesto. En este momento tengo una gran csv de 50GB que en cada par de 1000 líneas tiene una mala línea con un campo faltante. Entonces, la pregunta es ¿Podríamos decirle a postgresql que simplemente revise las líneas que arrojen un error y continúen el resto? – Smalcat

-1

Cualquiera que venga aquí con archivos más pequeños: esta es la solución más sencilla que he encontrado para este número inconsistente de delimitadores en un csv.

  1. Abra su archivo CSV.
  2. Ctrl + Shift + 8 (selecciona todos los datos)
  3. Ctrl + h (abre encontrar reemplazar)
  4. deje la caja del hallazgo en blanco para que su buscando cadenas de longitud 0.
  5. Ingrese un espacio en el cuadro reemplazar con.

Esto recorrerá todo el CSV y lo forzará a tener el recuento de columnas correcto en los delimitadores (,) incluso si no hay datos en esa columna.

Si está bien con Excel, puede convertir esto en una macro también, por lo que mi macro (Ctrl + g) lo hace de una sola vez. Creating a Macro

0

Esto es un error de PostgreSQL - el analizador csv ignora el último elemento vacío y arroja el error - "PG :: BadCopyFileFormat: ERROR: datos faltantes para la columna".

soy utilizan un truco estúpido:

Si último elemento está vacío, simple agregar una un delimitador al final de la cadena:

1,2,3 
1,2,, 

Este complemento se perdió último elemento en la fila para importar datos.

0

Una advertencia adicional: verifique el número de línea del error y asegúrese de que no sea una fila en blanco en el archivo CSV. Eso hará que postgres arroje el mismo error sobre los valores perdidos.

Cuestiones relacionadas