我希望\将大型CSV文件复制到Postgres 10,并且希望从格式错误的行(如额外的引号、预期的额外列)中产生各种类型的错误。
我想运行\COPY命令,如果失败,将写入违规行以进行手动更正。\COPY然后从下一行重新运行,直到新的失败。
最后,将手动更正失败的行,并手动将其添加到表中。
我希望能在这个问题上找到解决方案,必要时结合\COPY和bash脚本。
发布于 2018-05-10 18:56:05
Postgresql \copy只是在出错时失败,并中止整个导入。不能选择跳过格式错误的行或无效的列内容。
您需要使用像装载机这样的程序,它构建在复制的基础上,并增加了过滤错误的能力。如其手册中所述:
要将数据加载到PostgreSQL,pgloader使用复制流协议。虽然这是加载数据的更快的方法,但复制有一个重要的缺点:一旦PostgreSQL发出发送给它的任何数据的错误,不管问题是什么,整个数据集都会被PostgreSQL拒绝。为了解决这个问题,pgloader将数据分成25000行,这样当出现问题时,它只会影响那么多行数据。复制流发生时,每个批处理都保存在内存中,以便在发生错误时能够处理错误。当PostgreSQL拒绝整个批处理时,pgloader记录错误消息,然后通过在较小批中重试批行,将坏行(S)与已接受的行隔离开来。为此,pgloader将解析失败副本中的上下文错误消息,因为该消息包含找到错误的...行号。
https://serverfault.com/questions/911574
复制相似问题