是否可以将文本数据加载到PostgreSQL中的数据库?

问题描述 投票:0回答:1

我想从文本文件(将近1GB)中提取信息,并将其存储在PostgreSQL数据库中。文本文件的格式如下:

DEBUG, 2017-03-23T10:02:27+00:00, ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
DEBUG, 2017-03-24T12:06:23+00:00, ghtorrent-49 -- ghtorrent.rb:Repo Shikanime/print exists
...

并且我想从每行中提取'DEBUG',时间戳,'ghtorrent-40','ghtorrent'和“ Repo EFForg / https-everywhere存在”,并将其存储在数据库中。我已经使用其他语言(例如python(psycopg2)和C ++(libpqxx))完成了操作,但是是否可以在PostgreSQL中编写一个函数来导入整个数据本身。

我目前正在使用PostgreSQL的pgAdmin4工具。我考虑在函数中使用类似pg_read_file的内容来读取文件,但一次只能读取一行并将其插入表中。

sql postgresql pgadmin-4
1个回答
0
投票

我用于130gb或更大的大型XML文件的方法是将整个文件上传到临时表中,然后从中提取所需的内容。

考虑下表..

CREATE UNLOGGED TABLE tmp (raw TEXT);

..您可以使用单个psql行从控制台(unix)导入此1GB文件。

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

之后,您所需要做的就是应用逻辑来查询和提取所需的信息。根据表格的大小,您可以通过SELECT创建另一个表格,例如:

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

可选地,您可以将多个LIKE操作替换为单个SIMILAR TO

..并且您的数据将可以使用

SELECT * FROM t;

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

进一步阅读:COPY,PostgreSQL COPYarray functions

© www.soinside.com 2019 - 2024. All rights reserved.