将bcp与格式文件一起使用时如何指定行分隔符

时间:2013-05-22 09:58:05

标签: sybase sybase-ase bcp

我正在使用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实用程序用作行分隔符

2 个答案:

答案 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 获得的):

enter image description here

  • 顺便提一下,请注意最后的终结者!

答案 1 :(得分:0)

Sybase格式文件可能很难使用,我还没有让它们工作以重新排序列。如果没有格式文件,并且由于无法控制输入文件,那么您的选项是:

  1. 使用正确顺序的列重建表格
  2. 使用临时表或bcp的工作表,然后将数据从那里移到生产表中。
  3. 如果由于某种原因存在逻辑,则要求表保持现有的列顺序(这应该是不可能的),您可以使用正确的列顺序重建表,然后创建具有旧订单中的列。
  4. 根据您的数据格式,以下bcp命令行应该有效。

    bcp DBNAME..TABLENAME in MY_FILE.bcp -U username -P password -S SERVERNAME -c -t\| -r\\n