sql - 有没有办法将文本数据加载到 PostgreSQL 数据库中?

标签 sql postgresql pgadmin-4

我想从一个文本文件(近 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 contains”并将其存储在数据库中。

我已经使用 python (psycopg2) 和 C++ (libpqxx) 等其他语言完成了此操作,但是是否可以在 PostgreSQL 本身中编写一个函数来导入整个数据本身。

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

最佳答案

我对大型 XML 文件(130GB 或更大)使用的一种方法是将整个文件上传到一个临时的未记录表中,然后从那里提取我想要的内容。 Unlogged tables不能保证崩溃,但比记录的快得多,这完全适合临时表的目的;-)

考虑下表..

CREATE UNLOGGED TABLE tmp (raw TEXT);

..您可以使用控制台 (unix) 中的单行 psql 导入这个 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%'

根据您的逻辑调整 string_to_array 函数和 WHERE 子句!您也可以选择将这些多个 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)

提取数据后,您可以DROP TABLE tmp;来释放一些磁盘空间;)

进一步阅读:COPY , PostgreSQL array functionspattern matching

关于sql - 有没有办法将文本数据加载到 PostgreSQL 数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59588107/

相关文章:

mysql - 如何在两个子查询中使用分组依据并对行数求和?

mysql - 如何合并两个sql select语句

PostgreSQL Multi-Word-String 比较超时

PostgreSQL 9.4 : index not working in a pattern search

sql - 如何使用 pgadmin 4 导入模式 sql 文件?

php - MYSQL查询每次都出错

sql - 在 SQL Server 中修剪前导零的更好技术?

postgresql - 直接在 Google AppEngine 上使用 psycopg2

postgresql - 在 Chrome 中打开 PgAdmin 4

pgadmin-4 - 如何保存 PgAdmin 4 设置