CopyManager仅定界一次

时间:2019-04-27 14:21:28

标签: java postgresql

我正在尝试将密码列表导入到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)

1 个答案:

答案 0 :(得分:0)

PostgreSQL COPY命令支持ESCAPE选项。将此与转义冒号一起使用。由于ESCAPE默认为QUOTE,默认值为",因此将数据更改为此:

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

DELIMITER也必须是一个单字节字符。您的SQL应该是

COPY db FROM STDIN DELIMITER ':'