免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4371 | 回复: 2
打印 上一主题 下一主题

postgresql8.3的copy命令出问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-11 12:47 |只看该作者 |倒序浏览
我的系统: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 模式下的缺省空字符串(''),这样导致一个缺失的数值当作一个零长字符串输入。

我的问题如何解决??

论坛徽章:
0
2 [报告]
发表于 2009-01-12 10:19 |只看该作者
不是很了解CSV格式.
可能date格式有问题,应该加引号
"20090109",3.35,3.32,3.42,3.23

论坛徽章:
0
3 [报告]
发表于 2009-01-12 18:19 |只看该作者
我新建了一个空白数据表
mystock=# create table mystock();
CREATE TABLE
使用copy命令:
mystock=# COPY mystock FROM '/home/pt81/ok.csv' with DELIMITER ',' CSV HEADER;
错误: 最后期望字段后有额外数据 ...


表结构要建的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP