PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe uma maneira de carregar dados de texto no banco de dados no PostgreSQL?


Uma abordagem que uso com meus arquivos XML grandes - 130 GB ou mais - é carregar o arquivo inteiro em um arquivo temporário não registrado table e de lá extraio o conteúdo que quero. Unlogged tables não são à prova de falhas, mas são muito mais rápidos do que os registrados, o que atende totalmente ao propósito de uma tabela temporária;-)

Considerando a tabela a seguir..
CREATE UNLOGGED TABLE tmp (raw TEXT);

.. você pode importar este arquivo de 1 GB usando um único psql linha do seu console (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN" 

Depois disso tudo o que você precisa é aplicar sua lógica para consultar e extrair as informações desejadas. Dependendo do tamanho da sua tabela, você pode criar uma segunda tabela a partir de um SELECT , por exemplo.:
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 o string_to_array função e a função WHERE cláusula à sua lógica! Opcionalmente, você pode substituir esses múltiplos LIKE operações para um único SIMILAR TO .

.. e seus dados estarão prontos para serem reproduzidos:
SELECT * FROM t;

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

Uma vez que seus dados são extraídos, você pode DROP TABLE tmp; para liberar algum espaço em disco;)

Leitura adicional:COPY , PostgreSQL array functions e pattern matching