1

システム上のデータベースにbcpデータをインポートするためにユーティリティを使用していますSybaseSolaris

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 ユーティリティで行区切り記号として何が使用されているかはわかりません

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 に答える