sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Hay alguna forma de cargar datos de texto en la base de datos en PostgreSQL?

Un enfoque que uso con mis archivos XML grandes (130 GB o más) es cargar el archivo completo en un archivo temporal sin registrar. table y de ahí extraigo el contenido que quiero. Unlogged tables no son a prueba de fallas, pero son mucho más rápidos que los registrados, lo que encaja totalmente con el propósito de una tabla temporal;-)

Considerando la siguiente tabla..

CREATE UNLOGGED TABLE tmp (raw TEXT);

.. puede importar este archivo de 1GB usando un solo psql linea desde tu consola (unix)..

$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN" 

Después de eso, todo lo que necesita es aplicar su lógica para consultar y extraer la información que desea. Dependiendo del tamaño de su tabla, puede crear una segunda tabla desde un SELECT , por ejemplo:

CREATE TABLE t AS
SELECT 
  trim((string_to_array(raw,','))[1]) AS operation,
  trim((string_to_array(raw,','))[2])::timestamp AS tmst,
  trim((string_to_array(raw,','))[3]) AS txt
FROM tmp
WHERE raw LIKE '%DEBUG%' AND
      raw LIKE '%ghtorrent-40%' AND 
      raw LIKE '%Repo EFForg/https-everywhere exists%'

Ajuste el string_to_array función y el WHERE cláusula a su lógica! Opcionalmente, puede reemplazar estos múltiples LIKE operaciones a un solo SIMILAR TO .

.. y sus datos estarían listos para jugar con ellos:

SELECT * FROM t;

 operation |        tmst         |                               txt                                
-----------+---------------------+------------------------------------------------------------------
 DEBUG    | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)

Una vez que se extraen los datos, puede DROP TABLE tmp; para liberar algo de espacio en disco;)

Lectura adicional:COPY , PostgreSQL array functions y pattern matching