如何将维基百科英文页面标题导入到 postgresql 表中?

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

我从以下位置下载了这些标题: https://dumps.wikimedia.org/enwiki/20240420/enwiki-20240420-all-titles-in-ns0.gz

提取后,它们是一个换行符分隔的文本文件。 在 postgresql 中,我创建了一个表来存储数据:

create table titles (
  title varchar(255) primary key
);

我尝试使用文本或 csv 格式导入它:

thisdb=# COPY titles FROM '/some/path/enwiki-20240401-all-titles-in-ns0' with (format 'text');
ERROR:  duplicate key value violates unique constraint "titles_pkey"
DETAIL:  Key (title)=(//Xekwi_language) already exists.
CONTEXT:  COPY titles, line 23830

但是当我对文件进行较少的搜索时,只有一行有该记录,这很奇怪。也许这是一个逃避的问题? 不知怎的,它看到了线条:

//Xek\wi_language
//Xekwi_language

作为同一个条目。 当我单独插入它们时,没有冲突,但是当我进行格式文本复制时,它会将其视为冲突......为什么?

或 csv:

thisdb=# COPY titles FROM '/some/path/enwiki-20240401-all-titles-in-ns0' with (format 'csv');
ERROR:  extra data after last expected column
CONTEXT:  COPY titles, line 45: "!Alfaro_Vive,_Carajo!"

有人知道该怎么做吗?

postgresql wikipedia
1个回答
0
投票

标题最多为 255 个字符,因此 Diel 大小不是问题。 不知何故,这个摄取问题是由于转义 postgres 在输入上运行而引起的。查看标题的定义,我们发现 # < and > 是标题中很少或未使用的字符。

我能够通过 csv 摄取并使用未使用的字符作为分隔符、转义符和引号字符来实现此目的:

thisdb=# COPY titles FROM '/some/path/enwiki-20240401-all-titles-in-ns0' with (FORMAT 'csv', DELIMITER '<', ESCAPE '>', QUOTE '#');

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