Tengo un archivo .dat que consta de miles de líneas, donde cada línea está formada por 4 conjuntos de números, delimitados por :: . Termina luciendo algo como esto:
1234::482::4::1342.5321234 4342::532::1::1532.532431 Estoy tratando de copiar este archivo en una tabla de Postgres usando COPIAR DEL PROGRAMA. Por cierto, estoy usando PostreSQL 9.5. La razón por la que trato de usar la opción PROGRAMA es porque solo necesito los 3 primeros grupos de números de cada línea. Descubrí que puedo usar el comando awk para imprimir lo que quiero copiar en la terminal awk -F '::' '{print $1, $2, $3}' my_file.dat así que pensé que podría pasar ese comando awk a COPIAR DEL PROGRAMA y tener los primeros 3 grupos de números importados a la tabla de mi base de datos, que solo tiene 3 columnas.
Sin embargo, cuando trato de usar este comando con COPY FROM, sigo recibiendo errores. Intento ejecutar lo siguiente en psql
COPY my_table FROM PROGRAM 'awk -F ''::'' ''{print $1''%''$2''%''$3}'' my_file.dat' delimiter '%';
pero sigue recibiendo un error: ERROR: program "awk -F '::' '{print $1'%'$2'%'$3}' my_file.dat" failed DETAIL: child process exited with exit code 2 . He probado todo tipo de variaciones diferentes de esto con diferentes delimitadores, pero por mi vida no puedo averiguar dónde me estoy equivocando. ¿Estoy malinterpretando lo que puede hacer COPY FROM PROGRAM? ¿O me estoy perdiendo algo?
No puedo crear un archivo nuevo en mi sistema, por lo que no puedo ejecutar un comando para filtrar el archivo y crear uno nuevo con el formato deseado. Necesito poder escribir esto en una línea de código SQL, y pensé que COPIAR DESDE EL PROGRAMA era en realidad una forma genial de hacerlo, pero no puedo hacer que funcione.
Si awk devuelve un conjunto de resultados adecuado, puede intentar importarlo utilizando STDIN (Entrada estándar) de COPY en lugar de ejecutar awk desde dentro de PostgreSQL, por ejemplo.
awk -F "::" '{print $1"%"$2"%"$3}' ratings_copy.dat | psql -d db "COPY my_table FROM STDIN" Este comando toma el resultado de awk y lo canaliza a psql , que luego puede ser leído por COPY FROM . Otra opción es usar \copy ;-)
En awk, el código de salida 2 podría significar que no pudo abrir el archivo de entrada. Lo cual tiene sentido, ya que COPY está buscando el archivo en el lado del servidor, en el directorio de trabajo actual del proceso del servidor, que probablemente no es donde se encuentra el archivo. Use \copy en su lugar para buscar el archivo en el directorio de trabajo actual de psql. El mensaje de error real generado por awk debe encontrarse en el archivo de registro del servidor de la base de datos (cuando se usa con COPY; cuando se usa con \copy, debe aparecer en el stderr de psql).
¿Por qué no ejecutar el comando awk que ya había probado, en lugar de crear uno nuevo sin probar?
\COPY my_table FROM PROGRAM 'awk -F ''::'' ''{print $1,$2,$3}'' my_file.dat' delimiter ' '