我正在使用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_time
和active_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
两者都很完美
答案 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>
。