首页 > 解决方案 > CopyManager 只分隔一次

问题描述

我正在尝试将密码列表导入 postgresql 数据库。有没有办法只在分隔符第一次出现或仅在第一次出现时分隔一行?

要导入的数据:

demo@mail.ru:123
demo@mail.de:ab:c

我的导入代码:

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

CopyManager copyManager = new CopyManager((BaseConnection) connection);
FileReader fileReader = new FileReader(file);
copyManager.copyIn("COPY db FROM STDIN DELIMITER ':' ", fileReader);

此代码将在第二个示例中失败,因为它包含两个:字符。有什么想法或建议可以解决这个问题吗?

谢谢你的帮助!

建议转义:

org.postgresql.util.PSQLException: ERROR: extra data after last expected column
  Where: COPY pwned, line 1: "user@demo.pl:123":abc"
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
    at org.postgresql.core.v3.QueryExecutorImpl.processCopyResults(QueryExecutorImpl.java:1116)
    at org.postgresql.core.v3.QueryExecutorImpl.endCopy(QueryExecutorImpl.java:965)
    at org.postgresql.core.v3.CopyInImpl.endCopy(CopyInImpl.java:45)
    at org.postgresql.copy.CopyManager.copyIn(CopyManager.java:181)
    at org.postgresql.copy.CopyManager.copyIn(CopyManager.java:156)
    at TxtToPostgreSQL.FileToPostgreSQL.fileToPostgre(FileToPostgreSQL.java:22)
    at TxtToPostgreSQL.Import.main(Import.java:31)

标签: javapostgresql

解决方案


PostgreSQLCOPY命令支持该ESCAPE选项。将此与转义数据中的冒号一起使用。由于ESCAPE默认为QUOTEwhich 默认为",因此将您的数据更改为:

demo@mail.ru:123
demo@mail.de:ab":c

DELIMITER必须是单个单字节字符。你的 SQL 应该是

COPY db FROM STDIN DELIMITER ':' 

推荐阅读