223

.csvを使用してファイルをSQLServerにインポートするためのヘルプを探していますBULK INSERTが、基本的な質問がいくつかあります。

問題:

  1. CSVファイルデータ,の間に(カンマ)が含まれている可能性があります(例:説明)。これらのデータをインポート処理するにはどうすればよいですか?

  2. クライアントがExcelからCSVを作成する場合、コンマを含むデータは""[二重引用符)で囲まれます[以下の例のように]では、インポートでこれをどのように処理できますか?

  3. 一部の行に不正なデータがあり、どのインポートがスキップされているかを追跡するにはどうすればよいですか?(インポートはインポートできない行をスキップしますか)

ヘッダー付きのサンプルCSVは次のとおりです。

Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.

そしてインポートするSQLステートメント:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)
4

13 に答える 13

195

ベースの SQL Server CSV インポート

1) CSVファイルのデータ,には(例:説明)の間に(カンマ)が入っている場合がありますが、これらのデータを扱うようにインポートするにはどうすればよいですか?

解決

(コンマ) を区切り文字として使用している場合,、フィールド ターミネータとしてのコンマとデータ内のコンマを区別する方法はありません。私は別FIELDTERMINATORの likeを使用し||ます。コードは次のようになります。これにより、コンマと単一のスラッシュが完全に処理されます。

2) クライアントが Excel から csv を作成する場合、カンマを含むデータは" ... "[以下の例のように] (二重引用符) で囲まれているため、インポートはこれをどのように処理できますか?

解決

BULK 挿入を使用している場合、二重引用符を処理する方法はありません。データは二重引用符で行に挿入されます。データをテーブルに挿入した後、これらの二重引用符を「 」に置き換えることができます

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')

3) 一部の行に不良データが含まれている場合、どのインポートがスキップされるかをどのように追跡しますか? (インポートはインポートできない行をスキップしますか)?

解決

無効なデータまたはフォーマットのためにテーブルにロードされない行を処理するには、ERRORFILE プロパティを使用して処理できます。エラー ファイル名を指定すると、エラーのある行がエラー ファイルに書き込まれます。コードは次のようになります。

BULK INSERT SchoolsTemp
    FROM 'C:\CSVData\Schools.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv',
    TABLOCK
    )
于 2013-03-06T09:45:04.913 に答える
2

ここでのすべての回答は、データが「クリーン」であり (データ制約違反がないなど)、ファイルをサーバーに置くことができる場合にうまく機能します。ここで提供される回答の一部は、最初のエラー (PK 違反、データ損失エラーなど) で停止し、SSMS の組み込みのインポート タスクを使用すると、一度に 1 つのエラーが発生します。一度にすべてのエラーを収集したい場合 (.csv ファイルを提供した人にデータをクリーンアップするように伝えたい場合)、答えとして次のことをお勧めします。この回答は、SQLを自分で「作成」しているため、完全な柔軟性も提供します。

注: Windows OS を実行していて、Excel と SSMS にアクセスできると仮定します。そうでない場合は、ニーズに合わせてこの回答を微調整できると確信しています。

  1. Excel を使用して、.csv ファイルを開きます。空の列に、たとえば、A1 が名のデータを持つセルで、A2 が姓のデータを持つセルのINSERTように、個々のステートメントを作成する数式を記述します。=CONCATENATE("INSERT INTO dbo.MyTable (FirstName, LastName) VALUES ('", A1, "', '", B1,"')", CHAR(10), "GO")

    • CHAR(10)最終結果に改行文字を追加し、GOこれを実行してINSERT、エラーがあっても次に進むことができるようにします。
  2. =CONCATENATION()数式でセルを強調表示します

  3. Shift + End で、残りの行の同じ列を強調表示します

  4. リボン > ホーム > 編集 > 塗りつぶし > 下をクリック

    • これにより、数式がシート全体に適用されるため、手作業で何千もの行をコピーして貼り付けたり、ドラッグしたりする必要はありません。
  5. Ctrl + C で定式化された SQLINSERTステートメントをコピーします

  6. SSMS に貼り付け

  7. Excel では、おそらく予期せず、各コマンドINSERTGOコマンドが二重引用符で囲まれていることに気付くでしょう。これは、Excel から複数行の値をコピーする「機能」(?) です。"INSERTGO"INSERTをそれぞれ見つけて置き換えるだけで、それGOをきれいにすることができます。

  8. 最後に、インポート プロセスを実行する準備が整いました。

  9. プロセスが完了したら、[メッセージ] ウィンドウでエラーを確認します。すべてのコンテンツを選択 (Ctrl + A) して Excel にコピーし、列フィルターを使用して成功したメッセージを削除すると、すべてのエラーが残ります。

このプロセスは、ここでの他の回答よりも間違いなく時間がかかりますが、データが「ダーティ」で SQL 違反でいっぱいの場合は、少なくともすべてのエラーを一度に収集して、データを提供した人に送信できます。あなたのシナリオです。

于 2020-07-24T15:33:06.523 に答える
0

最初にExcelを開いてファイルをExcelにインポートし、次にDATAに移動し、TXTファイルからインポートし、0のプレフィックス値を保持するcsv拡張子を選択し、その列をTEXTとして保存します。それ以外の場合、Excelは先頭の0を削除するためです(ダブルクリックしないでください) 0 [ゼロ] で始まるフィールドに数値データがある場合は、Excel で開くことができます)。次に、タブ区切りテキスト ファイルとして保存します。Excel にインポートすると、GENERAL、TEXT などとして保存するオプションが表示されます。YourCompany、LLC などのフィールドの文字列の途中にある引用符も保持されるように、TEXT を選択します。

BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR   = '\n'
)

FORMAT および Fieldquote 機能を使用できればよいのですが、私のバージョンの SSMS ではサポートされていないようです。

于 2019-02-16T17:59:07.033 に答える