有没有办法将文本数据加载到 PostgreSQL 中的数据库?
Is there a way to load text data to database in PostgreSQL?
我想从文本文件(将近 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 exists" 并将其存储在数据库中。
我已经使用 python (psycopg2) 和 C++ (libpqxx) 等其他语言完成了此操作,但是 是否可以在 PostgreSQL 本身中编写一个函数来导入整个数据 本身。
我目前正在为 PostgreSQL 使用 pgAdmin4 工具。
我想在函数中使用类似 pg_read_file 的东西来读取文件,但一次读取一行并将其插入 table.
我对大型 XML 文件(130GB 或更大)使用的一种方法是将整个文件上传到临时 unlogged table 并从在那里我提取了我想要的内容。 Unlogged tables
不是崩溃安全的,但比记录的快得多,这完全适合临时 table ;-)
的目的
考虑以下 table ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
..您可以从您的控制台 (unix) 使用单个 psql
行导入这个 1GB 的文件..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
之后,您所要做的就是应用您的逻辑来查询和提取您想要的信息。根据 table 的大小,您可以从 SELECT
创建第二个 table,例如:
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;
释放一些磁盘 space ;)
进一步阅读:COPY
, PostgreSQL array functions
and pattern matching
我想从文本文件(将近 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 exists" 并将其存储在数据库中。
我已经使用 python (psycopg2) 和 C++ (libpqxx) 等其他语言完成了此操作,但是 是否可以在 PostgreSQL 本身中编写一个函数来导入整个数据 本身。
我目前正在为 PostgreSQL 使用 pgAdmin4 工具。 我想在函数中使用类似 pg_read_file 的东西来读取文件,但一次读取一行并将其插入 table.
我对大型 XML 文件(130GB 或更大)使用的一种方法是将整个文件上传到临时 unlogged table 并从在那里我提取了我想要的内容。 Unlogged tables
不是崩溃安全的,但比记录的快得多,这完全适合临时 table ;-)
考虑以下 table ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
..您可以从您的控制台 (unix) 使用单个 psql
行导入这个 1GB 的文件..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
之后,您所要做的就是应用您的逻辑来查询和提取您想要的信息。根据 table 的大小,您可以从 SELECT
创建第二个 table,例如:
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;
释放一些磁盘 space ;)
进一步阅读:COPY
, PostgreSQL array functions
and pattern matching