postgresql如何让复制自动解释格式化的数字字段?

postgresql如何让复制自动解释格式化的数字字段?,postgresql,sqlbulkcopy,Postgresql,Sqlbulkcopy,我有一个输入CSV文件,其中包含以下内容: SD-32MM-1001,"100.00",4/11/2012 SD-32MM-1001,"1,000.00",4/12/2012 我试图将其复制到postgresql表(varchar、float8、date)中,但遇到错误: # copy foo from '/tmp/foo.csv' with header csv; ERROR: invalid input syntax for type double precision: "1,000.0

我有一个输入CSV文件,其中包含以下内容:

SD-32MM-1001,"100.00",4/11/2012
SD-32MM-1001,"1,000.00",4/12/2012
我试图将其复制到postgresql表(varchar、float8、date)中,但遇到错误:

# copy foo from '/tmp/foo.csv' with header csv;
ERROR:  invalid input syntax for type double precision: "1,000.00"
Time: 1.251 ms
除了预处理输入文件外,PG中是否有一些设置使其读取类似于上面的文件并在副本中转换为数字形式?不是复印件吗

如果需要预处理,是否可以将其设置为COPY命令的一部分?(不是
psql\copy


非常感谢。

预处理的选项是首先将文本复制到临时表中。使用to_number函数将以下内容插入最终表格:

select to_number('1,000.00', 'FM000,009.99')::double precision;

这是一个奇怪的CSV文件,它用双引号将数值括起来,但将
SD-32MM-1001
等值保留为不带引号。事实上,我不确定我是否见过这样的CSV文件

如果我站在你的立场上,我会尝试对一个格式如下的文件进行
copy

"SD-32MM-1001",100.00,4/11/2012
"SD-32MM-1001",1000.00,4/12/2012
请注意,数字没有逗号。我能够使用成功导入该文件

copy test from '/fullpath/test.dat' with csv

我认为最好的办法是从源代码中获得更好的格式化输出。

谢谢Clodoaldo。我已经这么做了,但我真的不喜欢。除了为多个数据交换文件反复编写相同的内容(以及维护成本),这还需要预先了解实际的输入格式。我希望在放弃之前,可以让postgresql尝试使用类似于区域设置感知的atod()的异常。(关于linux方面,我还有第二个单独的问题:请看。谢谢。)迈克,谢谢,但我希望。。。FWIW我必须处理这种风格。在我的经验中,这样的CSV是相当常见的,而且绝对是结构良好的。@user1397919“结构良好的CSV”有点像“树形植物”。树的形状有很多种;-)仅供参考,目前正在进行的工作是在
COPY
\COPY
上启用输入和输出过滤器,但现在您唯一的选择是使用一些外部脚本预处理文件,或者将该列作为文本导入临时表,然后将清理后的版本插入到实际表中。感谢您的提醒。拥有挂钩的选择肯定会有所帮助。