如何将英文维基百科页面标题导入PostgreSQL表?
解决PostgreSQL导入维基百科标题文件的问题
问题1:TEXT格式导入时的转义重复错误
PostgreSQL的COPY TEXT默认会把反斜杠(\)当作转义字符,导致//Xek\wi_language被解析为//Xekwi_language,和另一行真实的//Xekwi_language重复触发主键冲突。
解决命令:
COPY titles FROM '/some/path/enwiki-20240401-all-titles-in-ns0' WITH ( FORMAT text, ESCAPE '' -- 禁用转义,让反斜杠作为普通字符存储 );
如果你的PostgreSQL版本不支持空ESCAPE参数,改用一个不会出现在标题中的特殊字符作为转义标记:
COPY titles FROM '/some/path/enwiki-20240401-all-titles-in-ns0' WITH ( FORMAT text, ESCAPE E'\x00' -- 用空字符作为转义符,无实际转义效果 );
问题2:CSV格式导入时的额外列错误
CSV格式默认用逗号作为列分隔符,标题中包含的逗号(比如!Alfaro_Vive,_Carajo!里的逗号)会被误判为新列,触发报错。
解决命令:
COPY titles FROM '/some/path/enwiki-20240401-all-titles-in-ns0' WITH ( FORMAT csv, DELIMITER E'\t', -- 用制表符作为列分隔符,标题中不存在该字符 QUOTE '', -- 禁用引号解析逻辑 HEADER false -- 文件无表头行 );
额外提示
如果服务器无法直接访问文件路径,可以结合管道直接导入压缩文件,避免提前解压:
gunzip -c /some/path/enwiki-20240401-all-titles-in-ns0.gz | psql -d thisdb -c "COPY titles FROM STDIN WITH (FORMAT text, ESCAPE '')"
内容的提问来源于stack exchange,提问作者spacether
相关产品推荐
相关产品推荐

