PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un moyen de charger des données texte dans la base de données dans PostgreSQL ?

Une approche que j'utilise avec mes gros fichiers XML - 130 Go ou plus - consiste à télécharger le fichier entier dans un fichier temporaire non connecté table et de là j'extrait le contenu que je veux. Unlogged tables ne sont pas anti-crash, mais sont beaucoup plus rapides que les tables connectées, ce qui convient parfaitement à l'objectif d'une table temporaire;-)

Considérant le tableau suivant ..

CREATE UNLOGGED TABLE tmp (raw TEXT);

.. vous pouvez importer ce fichier de 1 Go en utilisant un seul psql ligne depuis votre console (unix)..

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

Après cela, tout ce dont vous avez besoin est d'appliquer votre logique pour interroger et extraire les informations souhaitées. Selon la taille de votre tableau, vous pouvez créer un deuxième tableau à partir d'un SELECT , par exemple :

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%'

Ajustez le string_to_array fonction et le WHERE clause à votre logique ! En option, vous pouvez remplacer ces multiples LIKE opérations à un seul SIMILAR TO .

.. et vos données seraient prêtes à être utilisées :

SELECT * FROM t;

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

Une fois vos données extraites, vous pouvez DROP TABLE tmp; pour libérer de l'espace disque;)

Lectures complémentaires :COPY , PostgreSQL array functions et pattern matching