4

次の形式の CSV ファイルがあります。

data, data, "timestamp", data, data, data, data, data

DATETIMEタイムスタンプ データを囲む二重引用符を削除し、それをデータ型としてテーブルに挿入する必要があります。

フォーマットファイルを調査した後、私はこれを思いつきました:

10.0
8
1   SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
2   SQLCHAR 0   12  ","     2   Data        SQL_Latin1_General_CP1_CI_AS
3   SQLCHAR 0   26  "",""   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
4   SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
5   SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
6   SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
7   SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
8   SQLCHAR 0   12  "0x0a"  6   Data        SQL_Latin1_General_CP1_CI_AS

ここで、3 行目の Timestamp は、二重引用符で囲まれた項目です。

このファイルを一括挿入で使用しようとすると、エラー メッセージが表示される

メッセージ 4823、レベル 16、状態 1、行 2 一括読み込みできません。フォーマット ファイルの列番号が無効です。

必要なことを行うためにフォーマットファイルを変更する方法はありますか? 私はMSSQLを使用しています。

4

2 に答える 2

5

無効な列番号エラーは、おそらく宛先フィールド番号に列番号 8 ではなく列番号 6 が繰り返されていることが原因です。

ただし、「」を削除するには、列 2 と 3 の区切り文字で \" を使用する必要があります...

SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  ",\""   2   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   26  "\","   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  "\r\n"  6   Data        SQL_Latin1_General_CP1_CI_AS

-- note: use \r\n for row terminator for an Excel file saved as CSV

そのため、列 2 の区切り文字は実際には ," であり、列 3 (タイムスタンプ) の区切り文字は ", - " は区切り文字の一部であるため、データから削除されます。

注:最初の行に列タイトルがある場合、これは正しく機能しません。つまり、最初の行に次のような列ヘッダーが含まれている場合...

Field1Name,Field2Name,Timestamp,Field3Name ...

列ヘッダーのタイムスタンプを囲む引用符がないため、上記の区切り文字はこの行では機能しません。この結果、最初の行の列 1 と 2 には正しいデータが含まれますが、列 3 には行 1 に有効な区切り文字 (",) がないため、残りのすべての列ヘッダーと最初の 3 列が含まれます。最終的に行 2 の最後の列 3 で正しい区切り文字 (",) が見つかるまで、行 2 のフィールドを検索します。その後、行 2 の残りの部分が後の列に表示されます。それは混乱です。そして、あなたはそれを使用してそれを回避することはできません

FIRSTROW = 2

ヘッダー行を削除するか列 3 のタイトルを引用符で囲む必要があります -

Field1Name,Field2Name,"Timestamp",Field3Name ...

または、一括挿入が完了したら、SQL を介して引用符を削除します。

于 2013-01-24T23:07:52.900 に答える
0

これはうまくいきますか:

SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  ","     2   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   26  '","'   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  "0x0a"  6   Data        SQL_Latin1_General_CP1_CI_AS
于 2012-11-27T17:25:40.223 に答える