postgresql8.3的copy命令出问题?

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
回复
罗非鱼
帖子: 980
注册时间: 2008-04-12 12:44

postgresql8.3的copy命令出问题?

#1

帖子 罗非鱼 » 2009-01-11 12:36

我的系统:ubuntu8.10+postgresql8.3
我的原始数据:
csv格式(用文本编辑器打开,文件名为ok.csv)
"date","open","close","high","low"
20090109,3.35,3.32,3.42,3.23
20090108,3.3,3.31,3.39,3.26
20090107,3.31,3.35,3.36,3.27
20090106,3.17,3.29,3.31,3.12
20090105,3.13,3.19,3.24,3.08
20081231,3.19,3.12,3.23,3.11
20081230,0,0,0,0
20081229,3.17,3.39,3.4,3
20081226,3.28,3.19,3.28,3.18
20081225,3.39,3.26,3.39,3.23
20081224,3.3,3.42,3.56,3.27
20081223,3.57,3.3,3.57,3.27
20081222,3.54,3.58,3.63,3.39
20081219,3.66,3.54,3.74,3.52
20081218,3.5,3.49,3.5,3.38
20081217,3.4,3.5,3.59,3.38
20081216,3.56,3.47,3.56,3.26
20081215,4,3.61,4.04,3.58
20081212,3.79,3.98,4.19,3.72
20081211,3.98,3.82,4.07,3.76
20081210,3.96,3.91,4.05,3.84
20081209,3.83,3.83,3.83,3.83
20081208,0,0,0,0
20081205,3.24,3.48,3.48,3.21
20081204,3.24,3.27,3.38,3.18
20081203,3.09,3.19,3.2,3.07
20081202,2.97,3.07,3.08,2.95
20081201,2.94,3.04,3.05,2.85
我新建了一个空白数据表
mystock=# create table mystock();
CREATE TABLE
使用copy命令:
mystock=# COPY mystock FROM '/home/pt81/ok.csv' with DELIMITER ',' CSV HEADER;
错误: 最后期望字段后有额外数据
CONTEXT: COPY mystock, 行 2: "20090109,3.35,3.32,3.42,3.23"
请问如何解决??
附注:CSV HEADER表明我从第二行开始导入数据。
COPY
名称
COPY -- 在表和文件之间拷贝数据
语法

COPY tablename [ ( column [, ...] ) ]
FROM { 'filename' | STDIN }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'quote' ]
[ ESCAPE [ AS ] 'escape' ]
[ FORCE NOT NULL column [, ...] ]

COPY { tablename [ ( column [, ...] ) ] | ( query ) }
TO { 'filename' | STDOUT }
[ [ WITH ]
[ BINARY ]
[ HEADER ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'quote' ]
[ ESCAPE [ AS ] 'escape' ]
[ FORCE QUOTE column [, ...] ]

描述

COPY 在表和文件之间交换数据。COPY TO 把一个表的所有内容都拷贝到一个文件,而 COPY FROM 从一个文件里拷贝数据到一个表里(把数据附加到表中已经存在的内容里)。COPY TO 还能拷贝 SELECT 查询的结果。

如果声明了一个字段列表,COPY 将只在文件和表之间拷贝已声明字段的数据。如果表中有任何不在字段列表里的字段,那么 COPY FROM 将为那些字段插入缺省值。

带文件名的 COPY 指示 PostgreSQL 服务器直接从文件中读写数据。如果声明了文件名,那么服务器必须可以访问该文件,而且文件名必须从服务器的角度声明。如果指定了 STDIN 或 STDOUT ,那么数据将在客户前端和服务器之间流动。
参数

tablename

现存表的名字(可以有模式修饰)
column

可选的待拷贝字段列表。如果没有声明字段列表,那么将使用所有字段。
query

一个必须用圆括弧包围的 SELECT 或 VALUES 命令,其结果将被拷贝。
filename

输入或输出文件的绝对路径。Windows 用户可能需要使用 E'' 字符串和双反斜线作为路径分割符。
STDIN

声明输入是来自客户端应用
STDOUT

声明输入前往客户端应用
BINARY

使用二进制格式存储和读取,而不是以文本的方式。在二进制模式下,不能声明 DELIMITER, NULL, CSV 选项。
OIDS

声明为每行拷贝内部对象标识(OID)。如果为一个 query 拷贝或者没有 OID 的表声明了 OIDS 选项,则抛出一个错误。
delimiter

在文件中分隔各个字段的单个字符。在文本模式下,缺省是水平制表符,在 CSV 模式下是一个逗号。
null string

这是一个代表 NULL 值的字符串。在文本模式下缺省是 \N ,在 CSV 模式下是一个没有引号的 NULL 。如果你不想区分 NULL 和空字符串,那么即使在文本模式下你可能也会使用一个空字符串。

【注意】在使用 COPY FROM 的时候,任何匹配这个字符串的字符串将被存储为 NULL 值,所以你应该确保你用的字符串和 COPY TO 相同。

CSV

打开逗号分隔变量(CSV)模式
HEADER

声明文件包含一个标题头行,包含文件中每个字段的名字。输出时,第一行包含表的字段名;输入时,第一行被忽略。
quote

声明 CSV 模式里的引号字符。缺省是双引号。
escape

声明在 CSV 模式下应该出现在数据里 QUOTE 字符值前面的字符。缺省是 QUOTE 值(通常是双引号)。
FORCE QUOTE

在 CSV COPY TO 模式下,强制在每个声明的字段周围对所有非 NULL 值都使用引号包围。NULL 输出从不会被引号包围。
FORCE NOT NULL

在 CSV COPY FROM 模式下,把声明的每个字段都当作它们有引号包围来处理,因此就没有 NULL 值。对于在 CSV 模式下的缺省空字符串(''),这样导致一个缺失的数值当作一个零长字符串输入。

我的问题如何解决??
ypatton
帖子: 1
注册时间: 2016-04-25 11:42
系统: XP

Re: postgresql8.3的copy命令出问题?

#2

帖子 ypatton » 2016-04-25 11:45

老师您好,我和您遇到了同样的问题,请问您这个问题是怎么解决的?
回复