Postgresql 如何在postgres中复制文件

Postgresql 如何在postgres中复制文件,postgresql,file,copy,Postgresql,File,Copy,嗨,我正在尝试定期在数据库中插入一个文件。 此文本文件由JBOSS应用程序生成 唯一的困难是这些线并没有真正的结构化 例如: Text1 (tab) text2 (tab) text3 Text1 text1 (tab- text2 (tab) text3 ... 我所挣扎的部分是,有时有text2和text3的数据,有时没有,当运行时 COPY table_name (datumorig,rest0,rest1) FROM 'file/location/filename.txt' with

嗨,我正在尝试定期在数据库中插入一个文件。 此文本文件由JBOSS应用程序生成

唯一的困难是这些线并没有真正的结构化

例如:

Text1 (tab) text2 (tab) text3
Text1
text1 (tab- text2 (tab) text3
...
我所挣扎的部分是,有时有text2和text3的数据,有时没有,当运行时

COPY table_name (datumorig,rest0,rest1) FROM 'file/location/filename.txt' with NULL AS '';
我没有得到rest0的错误数据


我在这里做错了什么?

问题是,默认情况下,文件要求每个字段使用制表符分隔符

当它到达上面文件中的第二行时,它正在经历行结束(EOL),因此不会处理,因为它无法填充rest0和rest1字段(请参阅并向下滚动到文件格式)

如果您可以将JBOSS文件更改为使用空格分隔符而不是制表符,则可以将整个文件导入到由一个文本字段定义的临时表中,然后使用查询确定如何将行移动到目标表中,例如

Text1 text2 text3
Text1
Text1 text2
那么,您的文件内容是什么

CREATE TABLE staging (impfield text)
然后,在执行此操作之前,在不指定分隔符的情况下运行导入:

UPDATE DestinationTable
SET datumorig = LEFT(impfield, 5)
, rest0 = SUBSTRING(impfield from 7 for 5)
, rest1 = SUBSTRING(impfield from 13 for 5)
FROM staging

如果无法更改输入文件,您可能仍然可以使用一些不太可能的分隔符选择(例如,
分隔符e'\1'
)导入到
staging
。然后,您仍然可以使用选项卡将其分割(例如,
rest0=split_part(impfield,e'\t',2)
,假设字段本身中没有转义的选项卡…)。