8

XML 形式のファイルを使用して CSV ファイルをインポートしていますが、最初のデータ行がスキップされます。理由がわかりません。

フォーマットファイル

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='\n' />
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="COLUMN1" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="2" NAME="COLUMN2" xsi:type="SQLVARYCHAR" />
 </ROW>
</BCPFORMAT>

CSV

COLUMN1,COLUMN2
"ABC","ABC123456"
"TNT","TNT123456"

クエリ

SELECT *
FROM OPENROWSET(BULK 'C:\sample.csv',
FORMATFILE='C:\sample.xml',
FIRSTROW = 2) AS a

結果

COLUMN1 COLUMN2
------- ----------
"TNT    TNT123456"

(1 row(s) affected)

FIRSTROWを に変更する1と、結果は次のようになります。

COLUMN1                COLUMN2
---------------------  ----------
COLUMN1,COLUMN2  "ABC  ABC123456" 
"TNT                   TNT123456"

ヘッダー行が CSV から削除され、にFIRSTROW変更された1場合、結果は期待どおりに返されます。

COLUMN1 COLUMN2
------- ----------
"ABC    ABC123456" 
"TNT    TNT123456"

これはヘッダーと共に配信される自動レポートであるため、これを修正する他のオプションはありますか?

4

6 に答える 6

3

ここにはいくつかの問題があります。

  1. \n最初の行に有効なものがないと思われます。そうしないと、SQL Server は に変更したときに最初の 2 行を変更しませんFIRSTROW = 1

  2. 列区切り記号として使用","すると、最初と最後の列を除くすべての列でうまく機能します。これにより"、最初の列に先頭"が残り、最後の列に末尾が残ります。ROWTERMINATORに変更することで後者に対処できますが、ヘッダー行に"\n末尾を追加できる場合にのみ機能します(そこに有効なものがあることを確認するプロセス中)。その時点で、ヘッダー行がすべての面でデータ行と一致することを確認することもできます。"\n

    "COLUMN1","COLUMN2"
    -------------------^ this character has to be \n
    

正直なところ、これらすべての核心BCPと問題と戦うのに 1 週​​間を費やすことができると思いますが、術後のアクション (特定の列のBULK INSERT先頭/末尾の文字をトリミングするなど) を必要としない完全な解決策はまだありません。". "私の推奨事項: 20 分かけて、これらのファイルを自動的に修正するパーサーを C# で作成します。SQL Server がファイルを認識する前に、ヘッダー行を削除し、適切な区切り文字が配置されていることを確認し、すべての愚かな を削除します。ファイルのクリーンアップは、今ジャンプしているフープよりもはるかに手間がかかりません。これには解決策があると確信していますが、IIRCはかなり長い間それに取り組んできました...

于 2013-09-11T20:50:04.687 に答える
2

最初のフィールドのターミネータは、'","' ではなく、',' のみにする必要があります。

次の行に置き換えてください。動作します。

<FIELD ID="1" xsi:type="CharTerm" TERMINATOR=',' />

元のファイル形式は次のようになります...

最初の列は「,」で終了しています... つまり、SQL サーバーは最初の行を解析し、次に 2 番目の行を読み取り、最初のフィールドを取得します。

COLUMN1,COLUMN2  "ABC

2 番目のフィールドの読み取りと取得を続けます (まだファイルの 2 行目にいることを思い出してください)。

ABC123456"

これで最初の行が...

次に、次の行を読み取ります。

"TNT                   TNT123456"

したがって、最初の行をスキップすると、最初の行で引用符が使用されていないため、実際には最初の行がスキップされます...

それが役立つことを願っています..

于 2013-09-11T20:36:03.463 に答える
1

また、.CSV ファイルの文字エンコードを確認してください。署名が 3 バイトの UTF-8 の場合もあります。bcp.exe はこの形式を認識していないようです。ファイルが 1 バイト ASCII 形式で保存されていることを確認してください。UTF-8 コードページ パラメーター ( -C 65001 ) を指定することもできますが、AFAIR は一部の古い SQL サーバー バージョンでは機能しません。

編集: UTF-8 署名付きの .csv ファイルとしてインポートすると、同じ問題が発生しました: 最初のデータ行 (署名付きの行) がスキップされます。

于 2015-01-19T20:14:12.823 に答える
0
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\""/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\",\"" />
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\"\r\n"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="2" NAME="COLUMN1" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="3" NAME="COLUMN2" xsi:type="SQLVARYCHAR" />
 </ROW>
</BCPFORMAT>

ここで提供される BCP フォーマット ファイルは、COLUMN1 値の最初の " を本質的に無視できる最初のフィールドをスキップするのに役立ちます。レコードの FIELD1 は単一二重引用符で終了し、スキップされます。Field2 は二重引用符で終了します。カンマの後に二重引用符 \",\" が続きます (ここでのバック スラッシュは、二重引用符文字をエスケープするためのものです)。 \"\r\n.

システムは最初のフィールドを二重引用符まで読み取ってスキップし、2 番目のフィールドを \",\" まで読み取って COLUMN1 に割り当て、3 番目のフィールドを \"\r\n まで読み取り、COLUMN2 に割り当てて移動します。基本的に、これは CSV ファイル フィードに対して問題なく動作するはずです。

于 2013-11-02T16:16:00.137 に答える
0

私はまったく同じ問題を抱えていました.CSVデータのヘッダーにも二重引用符が必要です(BCPまたは一括挿入時に最初の行をスキップしようとしても、これは信じられないことです)または単にヘッダーを削除します(あなたのCSV ファイル):

"COLUMN1","COLUMN2" "ABC","ABC123456" "TNT","TNT123456"

于 2016-04-30T00:27:57.923 に答える
0

falseXML フォーマット ファイルのフィールドに入れ"0"ますが、追加の列はマップしません。

<FIELD ID="0" xsi:type="CharTerm" TERMINATOR='"' />

これは、次のクエリを使用してうまくいきました:

SELECT  * FROM OPENROWSET( BULK 'C:\sample.txt', FIRSTROW = 0,
   FORMATFILE = 'C:\sample.xml' ) AS a;
于 2014-12-04T21:53:57.363 に答える