java - 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)
解决方案
PostgreSQLCOPY
命令支持该ESCAPE
选项。将此与转义数据中的冒号一起使用。由于ESCAPE
默认为QUOTE
which 默认为"
,因此将您的数据更改为:
demo@mail.ru:123
demo@mail.de:ab":c
也DELIMITER
必须是单个单字节字符。你的 SQL 应该是
COPY db FROM STDIN DELIMITER ':'
推荐阅读
- angular - Angular & Spring Boot 2 & OAuth2 客户端
- automated-tests - 赛普拉斯 - 如果函数超时
- python - 将列组与布尔值组合以创建多个新列
- javascript - 如何在 chart.js 中添加额外的图例项?
- python - 与输入形状维度相关的 MRI 分割误差(conv2d 层的输入 0 与该层不兼容)
- flutter - Flutter:如何在每次相机移动时更新我的 InkResponse 或 InkWell 字符串值?
- python - 有没有办法将字符串列表作为逗号分隔的字符串传递给python中的函数参数
- java - PDF Box getXObjectNames() 无法识别我的 PDF 上的条形码,但它确实可以识别我从互联网上下载的 PDF 文件上的条形码
- rust - 如何在 Rust SPECS 中读取组件并写入具有相同组件的新实体?
- userform - Userform - 查找行和变量列引用的交集