1

我正在使用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

正如迈克尔在评论中提到的,使用格式文件很棘手。使用原始格式文件时,我尝试添加“|” 在每条记录的末尾,尽管文件未正确处理。

现在可以正确处理文件,尽管我不确定 bcp 实用程序将什么用作行分隔符

4

2 回答 2

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 "|"

下图显示了格式文件中每个组件的含义(我从这里得到):

在此处输入图像描述

  • 对了,请注意最后的终结者!
于 2016-10-28T18:35:33.527 回答
0

Sybase 格式文件使用起来可能很棘手,而且我还没有让它们工作以重新排序列。如果没有格式文件,并且由于您无法控制给定的输入文件,您的选择是:

  1. 使用正确顺序的列重建表
  2. 使用临时表或工作表作为输入bcp,然后将数据从那里移动到生产表中。
  3. 如果由于某种原因存在逻辑要求表保持其现有的列顺序(这应该不太可能),您可以使用正确的列顺序重建表,然后创建一个表的视图,其中包含旧秩序。

给定您的数据格式,以下bcp命令行应该可以工作。

bcp DBNAME..TABLENAME in MY_FILE.bcp -U username -P password -S SERVERNAME -c -t\| -r\\n
于 2013-05-23T11:33:07.410 回答