2016-09-15 3 views
0

ありがとうございます。最後のフィールドに改行文字が含まれているため、SQLの一括挿入エラー

SQLサーバーデータベースにフラットファイルをインポートしようとしています。切り捨てエラーが発生しています。私が問題に思っているのは、ファイルの最後のフィールドは、フリーフォームのテキストフィールドで、フィールド内で復帰できるようになっています。だから私は{CR} {LF}を行ターミネーターとして扱うことになりますが、時には{CR} {LF}は最後のフィールドの自由形式テキスト内の単なる改行です。

誰もこのデータを読み込む方法はありますか?ご協力いただきありがとうございます。ここで

は私のコードです:メモ帳で見て、あなたがキャリッジリターンとラインフィードを見ることができるように

DROP TABLE #SHELL 
CREATE TABLE #SHELL 
(
Field1 varchar(50) 
,Field2 varchar(50) 
,Field3 varchar(50) 
,Field4 varchar(50) 
,Field5 varchar(50) 
,Field6 varchar(160) 
,Field7 varchar(50) 
,Field8 varchar(50) 
,COMMENTS nvarchar(MAX) 
) 

BULK INSERT #SHELL 
FROM 
'[thefilepath].txt' 
WITH 
(
FIRSTROW = 1, 
FIELDTERMINATOR = '\t', 
ROWTERMINATOR = '\n' 
) 

はここ++テーブルの絵です。

Table Sample

+0

信頼性の高い動作が期待できないプロセスを使用しようとしています。私は基本的にchezy525に同意します。一括挿入は非常に非常に非常にデータの問題を処理します。基本的には、それがクリーンでない場合、データを拒否します。一括挿入を使用するには、通常、最初にフィルタ/クリーンアッププログラムを実行する必要があります。私は例えばpythonやperlスクリプトを書いたり走らせたりします。以前に解決されたエラーを修正する行単位での読み取り。これでデータが修正され、一括挿入で読み込むことができます。また、UltraEditのようなより強力なテキストエディタや、16進数を扱うようなテキストエディタを使用することを検討してください。 –

答えて

1

あなたのイメージが通ってくるしなかったが、輸出またはファイルがLINUXシステムから来たとき、多くの場合、あなたはHEXを使用する必要があります。別のエスケープを置き換え、あなたはそれについて意図的にしたい場合は、私は、彼らが維持するために重要である場合は、それらの「ミッドフィールド」ラインターミネータを削除、またはテキストファイルを事前処理したい

WITH (FIELDTERMINATOR = '\t',FIRSTROW=1,ROWTERMINATOR = '0x0a') 
+0

申し訳ありませんが、システムでは画像を貼り付けることができないため、リンクをクリックする必要があります。 「テーブルサンプル」は画像へのハイパーリンクです。 – ERock

+0

ありがとうございました@EROCKは解決しましたか? – scsimon

+0

さて、本当に。 @onupdatecascadeはスクリプト言語を使ってテキストを処理することについて正しいアイデアを持っていると思いますが、それは私の頭を少し上回っています。だから私は周りに尋ねる必要がありますし、私はそこに私を助けることができる人を知っているかどうかを確認する必要があります – ERock

1

:これを試してみてください彼らのためのキャラクター。

たとえば、ファイル内の各行を取り出し、列区切り文字で分割して戻すトークンの数を比較するスクリプトを作成して、実際に行がすべての列を含む完全な行かどうかを判断します。

トークンが予想よりも少ない行の場合は、前の行とマージします。オプションで、最後の列にエスケープ文字を挿入することもできます。

すべてのDBレコードが真に1行になるように、結果を新しいファイルに書き出します。

インポート後、オプションでupdateステートメントを使用して、行終端文字を最後のフィールドに戻します。たとえば、あなたがそれらを置き換えたとしたら、a |更新するために更新| SQLでは\ nで指定します。

例:ファイルの "記録" であるかもしれない:

value value1 value2 some long text 
wraps to another line and 
yet another line 
value value1 value2 a better behaved record on one line 

二つのレコードが、4行です。ファイルの前処理では、それを作る:

value value1 value2 some long text|wraps to another line and|yet another line 
value value1 value2 a better behaved record on one line 

その後、レコードがファイルに実際に1行に1つずつあり、そしてすべてのCRLF行とレコードの終わりの終わりです。一括インポートは機能しますが、最後の列の値は

some long text|wraps to another line and|yet another line 

となります。ファイル内の内容を正確に表現するためにCRLFでSQLで返す

+0

ありがとう、これは正しいアプローチのように思えます。しかし、私は正直なところ、それをどうやってやるのか分かりません。 Python? なぜ私はそれがSQLに入ったら、最後のフィールドに改行記号を置く必要があるのか​​分かりません。前の行と行をマージすると、2行目の行の終端文字が失われますか?もしそうなら、同じ問題を一括挿入しようとしているのではないでしょうか? – ERock

+0

個人的に私はPowerShellが好きですが、テキストを処理できるスクリプト言語はすべて動作します – onupdatecascade

+0

編集例を表示する – onupdatecascade

0

一括挿入だけではこれを実際に処理することはできません。したがって、次の2つのオプションがあります。

  1. 各レコードが1行にのみ表示されるようにファイルを事前処理します。基本的には、各ミッドフィールドCRLFを他の文字/文字列に置き換える必要があります。
  2. ファイルを単一のデータ列の一時表にロードしてから、SQLを使用して中間フィールドCRLFを結合し、最終的に最終表に到達します。注:SQLは一般的にこれ(分割文字列など)では本当に悪いですが、いくつかのライブラリを使用して助けてもらえますが、個人的にはこの解決方法を避けようとします。
関連する問題