2

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

SD-32MM-1001,"100.00",4/11/2012
SD-32MM-1001,"1,000.00",4/12/2012

我试图 COPY 将其导入 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 中转换为数字形式?COPY 以外的东西?

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

非常感谢。

4

2 回答 2

3

预处理的选项是首先作为文本复制到临时表中。从那里使用 to_number 函数插入最终表:

select to_number('1,000.00', 'FM000,009.99')::double precision;
于 2013-04-19T17:35:42.927 回答
2

这是一个奇怪的 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

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

于 2013-04-19T18:57:08.840 回答