0


1

PerlまたはPythonを使用してEOFをファイルに追加する方法は?

SQL Server Expressデータベースにデータを一括挿入しようとしています。 Windows XPコマンドプロンプトからbcpを実行すると、次のエラーが表示されます。

C:\temp>bcp  in  -T -f  -S

Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Native Client]Unexpected EOF encountered in BCP data-file

0 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 4391

そのため、EOFに問題があります。 PerlまたはPythonを使用してこのファイルに正しいEOF文字を追加する方法は?

3 Answer


3


EOFはファイルの終わりです。 おそらく発生したのは、ファイルが完全ではないということです。ソフトウェアはデータを予期しますが、もう必要なものはありません。

これらの種類のことは次の場合に発生します。

  • エクスポートが中断されます(ダンプ中にダンプソフトウェアを終了します)

  • ダンプファイルのコピー中にコピーを中止します

  • ダンプ中にディスクがいっぱいです

これらの種類のもの。

ちなみに、EOFは通常ファイルの終わりにすぎませんが、EOF文字が存在します。 これは、ターミナル(コマンドライン)入力が実際にファイルのように終了しないために使用されますが、そのようなユーティリティにEOFを渡す必要がある場合があります。 少なくともファイルの終わりを示すためではなく、実際のファイルで使用されるとは思わない。 ファイルシステムは、ファイルが終了した時点を完全に把握しており、それを検出するためのインジケーターは必要ありません。

編集 John Machin提供のコメントから恥知らずにコピー

実際のファイルで(意図せずに)発生する可能性があります。 必要なのは、(1)データ入力ユーザーが誤ってCtrl-Zを入力し、画面に何も表示せず、目的のShift-Zを入力して続行し、(2)検証ソフトウェア(たとえば、 社長のne)はテキストフィールドでCtrl-anykeyを喜んで受け入れ、データベースには小さな爆弾があり、誰かがフラットファイルへのクエリを作成するのを待っています。


3


予期しないEOFは、bcpリーダーがさらにデータを期待しているときにEOFを見つけたことを意味します。 このEOFは次のいずれかです。

(1)実際の物理的なファイルの終わり(これ以上読み込むバイトはありません)。 これは、データのフォーマットが間違っていることを意味します。 不完全なレコードについては、ファイルの終わり近くを確認してください。

OR

(2)Windowsの場合、テキストモードでファイルを読み取るプログラムは、Ctrl-Z(別名^ Z aka \ 'x1A' aka SUB aka SUBSTITUTE)は、端末だけでなく、任意のファイルから読み取るときのファイルの終わりマーカーとして。 これにはPythonが含まれます。動作はC stdlibによって決定されます。 データの「\ x1A」を確認してください。

*更新*コメントへの読みやすい応答:

Notepad ++では、[表示] / [シンボルの表示] / [すべての文字の表示]を実行して、通常とは異なる文字を表示できます。 Ctrlキーを押しながらFキーを押して、[検索する文字列]ボックスに\ x1aと入力し、[検索]パネルの[拡張]ラジオボタンを選択して検索できます。

または、少しのPythonで最初のCtrl-Zの行番号を取得できます。

bytes = open('bcp.dat', 'rb').read()
zpos = bytes.find('\x1a')
# if zpos is -1, no Ctrl-Z in file
print 1 + bytes[:zpos].count('\r\n')


1


これは、EOFが欠落している場合の問題ではありませんが、EOFが存在し、bcpで予期されていない場合です。

私はbcpツールの専門家ではありませんが、データファイルの形式に問題があるようです。