首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在PostgreSQL中导入制表符分隔的文本文件时忽略某些行?

如何在PostgreSQL中导入制表符分隔的文本文件时忽略某些行?
EN

Stack Overflow用户
提问于 2016-12-26 22:12:30
回答 4查看 850关注 0票数 4

我有一个30 GB的制表符分隔的文本文件,它有超过1亿行,当我想用\copy命令将这个文本文件导入到PostgreSQL表格时,有些行会出错。如何在导入postgresql时忽略这些行并记录被忽略的行?

我通过SSH连接到我的机器,所以我不能使用pgadmin!

在导入之前编辑文本文件非常困难,因为许多不同的行都有不同的问题。如果有一种方法可以在导入之前逐个检查行,然后对单个行运行\copy命令,这将是很有帮助的。

下面是生成表的代码:

代码语言:javascript
运行
复制
CREATE TABLE Papers(
    Paper_ID CHARACTER(8) PRIMARY KEY,
    Original_paper_title TEXT,
    Normalized_paper_title TEXT,
    Paper_publish_year INTEGER, 
    Paper_publish_date DATE,
    Paper_Document_Object_Identifier TEXT,
    Original_venue_name TEXT,
    Normalized_venue_name TEXT,
    Journal_ID_mapped_to_venue_name CHARACTER(8),
    Conference_ID_mapped_to_venue_name CHARACTER(8),
    Paper_rank BIGINT,
    FOREIGN KEY(Journal_ID_mapped_to_venue_name) REFERENCES Journals(Journal_ID),
    FOREIGN KEY(Conference_ID_mapped_to_venue_name) REFERENCES Conferences(Conference_ID));
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-29 02:22:56

不要直接加载到目标表中,而是加载到单列的临时表中。

代码语言:javascript
运行
复制
create table Papers_stg (rec text);

一旦加载了所有数据,就可以使用SQL对数据进行验证。

查找字段数错误的记录:

代码语言:javascript
运行
复制
select  rec
from    Papers_stg
where   cardinality(string_to_array(rec,'       ')) <> 11

创建包含所有文本字段的表

代码语言:javascript
运行
复制
create table Papers_fields_text
as
select  fields[1]  as Paper_ID                          
       ,fields[2]  as Original_paper_title              
       ,fields[3]  as Normalized_paper_title            
       ,fields[4]  as Paper_publish_year                
       ,fields[5]  as Paper_publish_date                
       ,fields[6]  as Paper_Document_Object_Identifier  
       ,fields[7]  as Original_venue_name               
       ,fields[8]  as Normalized_venue_name             
       ,fields[9]  as Journal_ID_mapped_to_venue_name   
       ,fields[10] as Conference_ID_mapped_to_venue_name
       ,fields[11] as Paper_rank                        

from   (select  string_to_array(rec,'       ')  as fields
        from    Papers_stg
        ) t
where   cardinality(fields) = 11

对于字段转换检查,您可能希望使用所述的概念here

票数 3
EN

Stack Overflow用户

发布于 2016-12-28 23:50:38

您唯一的选择是使用逐行处理。编写shell脚本(例如),它将遍历输入文件并将每一行发送到"copy“,然后检查执行结果,然后将失败的行写到一些"err_input.txt”中。

更复杂的逻辑可以提高处理速度。使用“部分”而不是逐行,并在失败的段上使用逐行逻辑。

票数 0
EN

Stack Overflow用户

发布于 2016-12-29 02:12:42

考虑使用pgloader

检查BATCHES AND RETRY BEHAVIOUR

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41332493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档