我正在使用bcp
实用程序将数据导入Sybase
系统上的Solaris
数据库
由于bcp文件是由另一个xml解析脚本生成的,因此我无法控制它以使其按照我想要的顺序生成字段。现在,bcp文件中的字段顺序与数据库表中的顺序略有不同。
我想使用bcp工具的格式文件来控制加载到数据库中的字段的顺序,所以我有如下的示例bcp文件并相应地构造了一个格式文件:
bcp文件:
603289|Aug 20 2011 12:00AM|YYY aaa OVD|KLYYP8
603284|Aug 22 2011 12:00AM|XXX bbb OVD|KLPK06
格式文件:
10.0
4
1 SYBCHAR 0 12 "|" 3 ver
2 SYBCHAR 0 26 "|" 2 first_dt
3 SYBCHAR 0 60 "|" 4 name1
4 SYBCHAR 0 10 "|" 1 name2
虽然我遇到了以下错误:
$bcp my_db..my_tbl in test.bcp -e error -f format.fmt -r\\n -S Sever -U user -P pw
Starting copy...
CSLIB Message: - L0/O0/S0/N24/1/0:
cs_convert: cslib user api layer: common library error: The conversion/operation was stopped due to a syntax error in the source field.
Unexpected EOF encountered in BCP data-file.
bcp copy in partially failed
1 rows copied.
我怀疑错误的原因是bcp实用程序无法识别行分隔符,即'\ n'字符(我已使用od -c test.bcp
来检查),尽管-r\\n
选项在命令中似乎不起作用,应将行分隔符指定为'\ n'字符。
有没有人有线索?
修改
我对格式文件进行了更改,现在工作正常,我更改了“|”中最后一个字段的字段分隔符到'\ n'如下:
新格式文件:
10.0
4
1 SYBCHAR 0 12 "|" 3 ver
2 SYBCHAR 0 26 "|" 2 first_dt
3 SYBCHAR 0 60 "|" 4 name1
4 SYBCHAR 0 10 "\n" 1 name2
正如Michael在评论中提到的,使用格式文件很棘手。使用原始格式文件时,我试图添加“|”在每个记录的末尾,尽管文件未正确处理。
现在文件可以正确处理,虽然我不确定bcp实用程序用作行分隔符
答案 0 :(得分:2)
作为大多数加载器实用程序,BCP不读取行,它只从源文件中获取一堆字节,因此,您必须在.fmt文件中指定结束行字符,主要是在行尾字符处可以根据文件的编码而有所不同。
例如,在您提供的示例中,您在源文件中有这个:
603289|Aug 20 2011 12:00AM|YYY aaa OVD|KLYYP8
603284|Aug 22 2011 12:00AM|XXX bbb OVD|KLPK06
但根据编码你会得到这个:
603289|Aug 20 2011 12:00AM|YYY aaa OVD|KLYYP8\n603284|Aug 22 2011 12:00AM|XXX bbb OVD|KLPK06
或者这个:
603289|Aug 20 2011 12:00AM|YYY aaa OVD|KLYYP8\n\r603284|Aug 22 2011 12:00AM|XXX bbb OVD|KLPK06
这就是为什么你在最后一栏上做的终结者的改变如此重要:
10.0
4
1 SYBCHAR 0 12 "|" 3 ver
2 SYBCHAR 0 26 "|" 2 first_dt
3 SYBCHAR 0 60 "|" 4 name1
4 SYBCHAR 0 10 "\n" 1 name2 * The last terminator was not "|"
下图显示了格式文件中每个组件的含义(我是从here 获得的):
答案 1 :(得分:0)
Sybase格式文件可能很难使用,我还没有让它们工作以重新排序列。如果没有格式文件,并且由于无法控制输入文件,那么您的选项是:
bcp
的工作表,然后将数据从那里移到生产表中。根据您的数据格式,以下bcp
命令行应该有效。
bcp DBNAME..TABLENAME in MY_FILE.bcp -U username -P password -S SERVERNAME -c -t\| -r\\n