我想要将大型 CSV 文件复制到 Postgres 10,并且预计格式错误的行会出现各种类型的错误,即额外的引号、预期的额外列等。
我想运行 \COPY 命令,如果失败,则将有问题的行写入日志以便进行手动更正。然后从下一行重新运行 \COPY 直到出现新的失败。
最后,失败的行将被手动更正,并手动添加到表中。
我希望得到解决方案,如有必要,结合 \COPY 和 bash 脚本。
答案1
Postgresql\copy
会因错误而失败并中止整个导入。没有选项可以跳过格式错误的行或无效的列内容。
你需要使用类似加载器它建立在 COPY 之上,并增加了过滤错误的功能。如其手册中所述:
为了将数据加载到 PostgreSQL,pgloader 使用 COPY 流式传输协议。虽然这是加载数据的最快方法,但 COPY 有一个重大缺点:只要 PostgreSQL 发送的任何数据位出现错误,无论问题是什么,整个数据集都会被 PostgreSQL 拒绝。
为了解决这个问题,pgloader 将数据分成 25000 行的批次,这样当出现问题时,只会影响这么多行数据。在 COPY 流发生时,每个批次都保存在内存中,以便能够处理发生的错误。
当 PostgreSQL 拒绝整个批次时,pgloader 会记录错误消息,然后通过以较小的批次重试批处理行来将坏行与已接受的行隔离开来。为此,pgloader 会解析失败的 COPY 中的 CONTEXT 错误消息,因为该消息包含发现错误的行号[...]