PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es eine Möglichkeit, Textdaten in die Datenbank in PostgreSQL zu laden?

Ein Ansatz, den ich bei meinen großen XML-Dateien verwende – 130 GB oder mehr – besteht darin, die gesamte Datei in ein temporäres nicht angemeldetes hochzuladen Tabelle und daraus extrahiere ich den gewünschten Inhalt. Unlogged tables sind nicht absturzsicher, aber viel schneller als geloggte, was dem Zweck einer temporären Tabelle durchaus entgegenkommt;-)

Betrachtet man die folgende Tabelle ..

CREATE UNLOGGED TABLE tmp (raw TEXT);

.. Sie können diese 1-GB-Datei mit einem einzigen psql importieren Zeile von Ihrer Konsole (Unix)..

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

Danach müssen Sie nur noch Ihre Logik anwenden, um die gewünschten Informationen abzufragen und zu extrahieren. Je nach Größe Ihrer Tabelle können Sie aus einem SELECT eine zweite Tabelle erstellen , z. B.:

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

Passen Sie string_to_array an Funktion und das WHERE Klausel zu Ihrer Logik! Optional können Sie diese mehrfachen LIKE ersetzen Operationen zu einem einzelnen SIMILAR TO .

.. und Ihre Daten wären spielbereit:

SELECT * FROM t;

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

Sobald Ihre Daten extrahiert sind, können Sie DROP TABLE tmp; um Speicherplatz freizugeben;)

Weiterführende Literatur:COPY , PostgreSQL array functions und pattern matching