如何使用格式文件将csv文件导入到sybaseASE中,列数少于表字段?

时间:2017-02-04 19:02:31

标签: database csv unix bcp

我正在使用BCP将数据加载到UNIX

下的SybaseASET表中

我有一个包含4列的temp.csv文件:

name | id | attr1 | attr2
FIERA|20138||
SECOR|73328||
WELLINGTON|92413||
带有两个额外列的

template表定义如下:

create table  template
(name varchar(10),
 id int,
 attr1 varchar(5) default '',
 attr2 varhcar(5) default '',
 creation_time datetime null,
 active_flag char(1) null)

bcp.fmt格式文件:

10.0
7
1 SYBCHAR 0 10 "|" 1 name
2 SYBINT4 0 4 "|" 2 id
3 SYBCHAR 0 5 "|" 3 attr1
4 SYBCHAR 0 5 "|" 4 attr2
5 SYBDATETIME 0 8 "|" 0 creation_time
6 SYBCHAR 0 1 "|" 0 active_flag
7 SYBCHAR 0 10 "\r\n" 0 end

我的目的是将所有值包括temp.csv文件的空白到模板表中,将最后两个字段creation_timeactive_flag保留为null

我使用命令:

bcp client..template in temp.csv -F2 -f bcp.fmt -U -P -S

但是,我总是遇到以下错误:

Unexpected EOF encountered in BCP data-file. 
bcp copy in partially failed

我仔细检查了我的temp.csv文件,所有行终止符都是\r\n,因为我在fromat文件中列出,为什么我仍然遇到意外的EOF错误?

挣扎太多次,都失败了。有人可以帮帮我吗?感谢

=================== 2月06日更新=================

谢谢James,我将格式文件更新为以下内容:

10.0
6
1 SYBCHAR 0 0 "|" 5 creation_time
2 SYBCHAR 0 0 "|" 6 active_flag
3 SYBCHAR 0 10 "|" 1 name
4 SYBCHAR 0 4 "|" 2 id
5 SYBCHAR 0 5 "|" 3 attr1
6 SYBCHAR 0 5 "\r\n" 4 attr2

然后我提示“在bcp格式文件中找到错误的主机列号”

=============================================== ============================

============解决方案就在这里=============

第一个解决方案:

10.0
4
1 SYBCHAR 0 10 "|" 1 name
2 SYBCHAR 0 4 "|" 2 id
3 SYBCHAR 0 5 "|" 3 attr1
4 SYBCHAR 0 5 "\r\n" 4 attr2

第二个解决方案:

10.0
6
1 SYBCHAR 0 10 "|" 1 name
2 SYBCHAR 0 4 "|" 2 id
3 SYBCHAR 0 5 "|" 3 attr1
4 SYBCHAR 0 5 "\r\n" 4 attr2
5 SYBCHAR 0 0 "" 5 active_flag
6 SYBCHAR 0 0 "" 6 creation_time

两者都很完美

1 个答案:

答案 0 :(得分:0)

您的格式文件存在一些问题。

根据Sybase documentation,您应该只使用1 SYBCHAR 0 0 "|" 7 active_flag

  

主机文件数据类型

     

主机文件数据类型是指该字段的存储格式   主机数据文件,而不是数据库表列的数据类型。

DBMS知道其列的数据类型;它不知道输入文件是如何编码的。

请记住,描述列(3以后)的行中的第一个元素表示文件中的列。您的数据文件没有第5-7列。我怀疑该字段引发了错误消息。

此外,afaik 0不是目标表中的有效colid。如果要为特定列指示NULL,请说它从开头开始并且没有长度,

-r

最后,没有必要考虑格式文件中的行终止符。您可以使用bcp client..template in temp.csv -F2 -f bcp.fmt -r \r\n -U -P -S 选项在bcp命令行上执行此操作。如果您正在使用Windows,IIRC将成为

10.0
6
1 SYBCHAR 0 0 "|" 5 creation_time
1 SYBCHAR 0 0 "|" 6 active_flag
1 SYBCHAR 0 10 "|" 1 name
2 SYBCHAR 0 4 "|" 2 id
3 SYBCHAR 0 5 "|" 3 attr1
4 SYBCHAR 0 5 "" 4 attr2

在Linux当然,你必须引用或逃避反斜杠。

编辑:为清楚起见,我认为您的文件应该是这样的,

SYBCHAR

如果这不起作用,你必须找到一个知道答案的人。我没有系统方便测试。

没有什么可以阻止数据文件的任何部分映射到许多列。但是,在格式文件的字段1中,您提到数据文件列5& 6,但您的数据文件只有4列。我认为这是它告诉你的错误信息。

  

你的意思是我在格式文件中放入的所有数据类型应该是' SYBCHAR'

是。格式文件可以描述文本或二进制文件。您的文件是文本,因此您的所有数据(在文件中)都是<html> <head> <title>JQVMap - World Map</title> <link href="../dist/jqvmap.css" media="screen" rel="stylesheet" type="text/css"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script> <script type="text/javascript" src="../dist/jquery.vmap.js"></script> <script type="text/javascript" src="../dist/maps/jquery.vmap.world.js" charset="utf-8"></script> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('#vmap').vectorMap({ map: 'world_en' }); }); </script> </head> <body> <div id="vmap" style="width: 600px; height: 400px;"></div> </body> </html>