SQLファイルにCSVファイルをインポートする


186

インポートするためのヘルプを探しています .csv使用してSQL Serverにファイルます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
)

SSMSの可能性があります:Excelからデータをインポート(コピー/貼り付け)する方法が役立ちます(使用したくない場合、BULK NSERTまたはそのアクセス許可がない場合)。
デニス

回答:


169

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

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

解決

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

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
    )

1
助けてくれてありがとう。ソリューションを登録する#1:作成できるか|| Excelから値ファイルを分離しましたか?ソースファイルの約20%がクライアントによってExcelを使用して作成されているためです。
Prabhat 2013年

@Prabhat ExcelファイルをSQL Serverにロードする方法を教えてください。
Vishwanath Dalvi 2013年

これらは、ロードしているExcelファイルではありません。クライアントはExcelを使用して.CSVファイルを作成しています(アプリケーションがインポートするソースデータの20%)。|| Excelを使用してcsvファイルを作成するかどうかを尋ねていました|| 列値セパレータとして?
Prabhat 2013年

クライアントがExcelからCSVファイルを作成する方法に影響がある場合は、Excelで区切り文字を設定する方法を彼らに教えることができます(さらに、もはや「カンマ」区切りファイルではなく、パイプ(|)区切りになります)。たとえば、このためにジャンプしているフープを考えて、SSISがある場合は、チェックすることをお勧めします。SQLServer 2012以降のバージョンには、非常に堅牢なSSISデザイナ(VS 2012以降でも)があります。クライアントがcsvではなくExcelファイルを送信できるようにする
qxotk

これが完全に正確かどうかはわかりません。SQL一括挿入で二重引用符を処理できます。このトピックにはスタックオーバーフローがあり、フォーマットファイルを使用して、一括挿入のさまざまな区切り記号を教えることができます。stackoverflow.com/questions/25726385/...の advancesharp.com/blog/1083/...
DtechNet

33

最初に、CSVファイルをインポートするデータベースにテーブルを作成する必要があります。テーブルが作成されたら、以下の手順に従います。

•SQL Server Management Studioを使用してデータベースにログインします

•データベースを右クリックして選択します Tasks -> Import Data...

•ボタンをクリックしNext >ます

•データソースには、を選択しますFlat File Source。次に、[参照]ボタンを使用してCSVファイルを選択します。Next >ボタンをクリックする前に、データのインポート方法を設定するのにしばらく時間をかけてください。

•宛先には、正しいデータベースプロバイダーを選択します(SQL Server 2012の場合は、SQL Server Native Client 11.0を使用できます)。サーバー名を入力します。Use SQL Server Authenticationラジオボタンをチェックしてください。Next >ボタンをクリックする前に、ユーザー名、パスワード、データベースを入力します。

•[ソーステーブルとビューの選択]ウィンドウでは、Next >ボタンをクリックする前にマッピングを編集できます。

•チェックRun immediatelyボックスをオンにして、Next >ボタンをクリックします。

Finishボタンをクリックしてパッケージを実行します。

上記はこのウェブサイトで見つかりました(私はそれを使用してテストしました):



1
それは、インポート処理中に作成することができ、テーブルを事前に作成する必要はありません
bsideを

1
とても便利な「データをインポートする方法を設定するのに少し時間を費やす」という行があるWebページからカットアンドペーストするだけでいいのです。それが私が探していたものすべてでした:私はそれをまったく構成することができないようです!
Auspex

ああ、そして「SQLサーバー認証を使用する」ラジオボタンをチェックするのは間違っています。Windows認証を使用した方がよい場合があるからです。どちらでも問題ありません。
Auspex

おかげで手続きの上に実装するためのイメージを持つステップの手順によってステップを発見した、一見の価値:qawithexperts.com/article/sql/...
user3559462

23

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

FORMAT = 'CSV'、FIELDQUOTE = '"'オプションを使用する必要があります。

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

1
書式指定子がSQL Serverの2017年以降のみ利用可能であることに注意してください
kristianp

13

データのコンマの問題を解決する最良の、最も迅速で最も簡単な方法は、Windowsのリスト区切り設定をコンマ以外のもの(パイプなど)に設定した後、Excelを使用してコンマ区切りファイルを保存することです。これにより、パイプ(またはその他)で区切られたファイルが生成され、インポートできます。これはここで説明されています


4

最初にCSVファイルをデータテーブルにインポートする必要があります

次に、SQLBulkCopyを使用してバルク行を挿入できます

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlBulkInsertExample
{
    class Program
    {
      static void Main(string[] args)
        {
            DataTable prodSalesData = new DataTable("ProductSalesData");

            // Create Column 1: SaleDate
            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
            dateColumn.ColumnName = "SaleDate";

            // Create Column 2: ProductName
            DataColumn productNameColumn = new DataColumn();
            productNameColumn.ColumnName = "ProductName";

            // Create Column 3: TotalSales
            DataColumn totalSalesColumn = new DataColumn();
            totalSalesColumn.DataType = Type.GetType("System.Int32");
            totalSalesColumn.ColumnName = "TotalSales";

            // Add the columns to the ProductSalesData DataTable
            prodSalesData.Columns.Add(dateColumn);
            prodSalesData.Columns.Add(productNameColumn);
            prodSalesData.Columns.Add(totalSalesColumn);

            // Let's populate the datatable with our stats.
            // You can add as many rows as you want here!

            // Create a new row
            DataRow dailyProductSalesRow = prodSalesData.NewRow();
            dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
            dailyProductSalesRow["ProductName"] = "Nike";
            dailyProductSalesRow["TotalSales"] = 10;

            // Add the row to the ProductSalesData DataTable
            prodSalesData.Rows.Add(dailyProductSalesRow);

            // Copy the DataTable to SQL Server using SqlBulkCopy
            using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = prodSalesData.TableName;

                    foreach (var column in prodSalesData.Columns)
                        s.ColumnMappings.Add(column.ToString(), column.ToString());

                    s.WriteToServer(prodSalesData);
                }
            }
        }
    }
}

BulkCopyクラスのよりユーザーフレンドリーなラッパーbusybulkcopy.codeplex.com
busytools

3

これが私がそれを解決する方法です:

  1. ExcelでCSVファイルをXLSシートとして保存するだけです(そうすることで、区切り文字について心配する必要はありません。Excelのスプレッドシート形式はテーブルとして読み取られ、SQLテーブルに直接インポートされます)

  2. SSISを使用してファイルをインポートする

  3. インポートマネージャーでカスタムスクリプトを記述して、探しているデータを省略/変更します(またはマスタースクリプトを実行して、削除しようとしているデータを精査します)。

幸運を。


3
反対票:SSISを使用したXLSファイルのインポートはひどいです。SSISはExcelデータのデータ型を推測しようとしますが、間違って推測する可能性があり、それについてあなたができることは何もありません。CSVを使用する方がはるかに優れています。
NReilingh 2017

まあ、私もcsvをお勧めしますが、OPのシナリオを読んだことがある場合は、XLSシートの問題ではない、特に区切り文字に関する特別なシナリオがいくつかありました。通常、このような特殊なケースのシナリオでは、広範なソリューションは必要ありませんが、データを保持する修正が必要です。SSISでは、ファイルをアップロードする際に、ソーステーブルと宛先テーブルの間のデータマッピングを選択できるので、関連する作業が簡単になります。これが、この方法が迅速なハックとして提案された理由です。
Zee

1
SSISは既にCSVテキスト区切り文字を処理できます。とにかくSSISを使用している場合は、CSVをXLSとして保存するという問題に最初に遭遇すると、理由もなく破損の可能性があると私は思います。
NReilingh

また、Excelには大きすぎるCSVファイルを日常的に使用しています。
Auspex

3

SQLインポートウィザードを使用しないため、手順は次のようになります。

ここに画像の説明を入力してください

  1. オプションタスクでデータベースを右クリックして、データをインポートします。

  2. ウィザードが開いたら、暗示するデータのタイプを選択します。この場合、それは

フラットファイルソース

CSVファイルを選択します。CSVでテーブルのデータ型を設定できますが、CSVから取得することをお勧めします。

  1. [次へ]をクリックして、最後のオプションである

SQLクライアント

認証の種類に応じて選択します。これが完了すると、非常に重要なオプションが表示されます。

  1. CSVでテーブルのIDを定義できます(CSVの列はテーブルのフィールドと同じ名前にすることをお勧めします)。[マッピングの編集]オプションでは、スプレッドシートの列を含む各テーブルのプレビューを確認できます。ウィザードでデフォルトでIDを挿入する場合は、このオプションをオフのままにします。

ID挿入を有効にする

(通常は1から開始しない)、代わりにCSVにIDの列がある場合、有効なIDの挿入を選択します。次のステップはウィザードを終了することです。ここで変更を確認できます。

一方、次のウィンドウでアラートが表示される場合があります。 警告これは無視することが理想的です

このリンクには画像があります


0

最初にExcelを開いてファイルをExcelにインポートし、次にDATAに移動して、TXTファイルからインポートし、0のプレフィックス値を保持するcsv拡張子を選択し、その列をTEXTとして保存します。 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ではサポートされていないようです。


0

受け入れられた回答があることはわかっていますが、それでも、誰かが問題を解決するのに役立つ可能性がある私のシナリオを共有したいと思います。 ツール

  • ASP.NET
  • EFコードファーストのアプローチ
  • SSMS
  • エクセル

SCENARIO 私はバルク・ロードを使用しようとした後にしたビュー上に表示されるようにCSV形式でのデータセットをロードしましたが、私はロードできないのですBULK LOAD使用していました

FIELDTERMINATOR = ','

Excelセルも使用していました, が、使用Flat file sourceしていたため直接使用することもできませんでした。Code-First Approachていましたが、SSMS DBで作成したモデルのみして実行していたため、後で使用する必要があるモデルではなく、。

解決

  1. フラットファイルソースを使用し、CSVファイルからDBテーブルを作成しました(SSMSでDBを右クリック->フラットファイルをインポート-> CSVパスを選択し、指示どおりにすべての設定を行います
  2. Visual Studioでモデルクラスを作成しました(SQLにロードされたCSVファイルと同じすべてのデータ型と名前を保持する必要があります)
  3. Add-MigrationNuGetパッケージコンソールで使用
  4. DBを更新

0

これが上記の質問に対する正確な解決策ではないことは知っていますが、私にとって、別のサーバーにある1つのデータベースからローカルにデータをコピーしようとしたとき、それは悪夢でした。

私が最初でそれを行うとしていた輸出へのサーバーからデータCSV/txt、その後インポート私の地元のテーブルにそれを。

両方のソリューション:インポートするクエリをCSV書き留めるか、SSMS データインポートウィザードを使用すると、常にエラーが発生しました(エラーは非常に一般的で、解析に問題があることを示しています)。そして、私は特別なことは何もしていませんでしたが、ローカルにエクスポートしてCSVからインポート しようとしCSVましたDBにですが、エラーは常にそこにありました。

マッピングセクションとデータプレビューを確認しようとしていましたが、常に大きな混乱がありました。そして、主な問題はtable、含まれていた列の1つから発生したことでJSONあり、SQLパーサーはそれを誤って処理していました。

したがって、最終的には別の解決策を考え出し、他の誰かが同様の問題を抱えている場合に備えて共有したいと思います。


私がしたことは、エクスポートウィザードを使用したことです、外部サーバーでをです。

同じプロセスを繰り返す手順は次のとおりです
。1)データベースを右クリックして選択します。Tasks -> Export Data...

2)ウィザードが開いたら、[次へ]を選択し、[データソース]の代わりに[SQL Server Native Client]を選択します。

ここに画像の説明を入力してください

外部サーバーの場合は、おそらく「認証モード:」で「SQLサーバー認証を使用する」を選択する必要があります。

3)Nextを押した後、Destionationを選択する必要があります。
そのためには、再度「SQL Server Native Client」を選択してください。
今回は、ローカル(または他の外部DB)を提供できますDB

ここに画像の説明を入力してください

4)[次へ]ボタンをクリックした後、テーブル全体をコピーするかDB、クエリを書き留めてコピーする正確なデータを指定するかの2つのオプションがあります。私の場合、テーブル全体(必要以上に大きい)は必要ありませんでしたが、その一部だけなので、「転送するデータを指定するクエリを作成する」を選択しました。

ここに画像の説明を入力してください

ウィザードに移動する前に、別のクエリエディターでクエリを書き留めてテストすることをお勧めします。

5)最後に、データが選択される宛先テーブルを指定する必要があります。

ここに画像の説明を入力してください

データのエクスポートでエラーが発生する場合や、データについて確信が持てず、目的の正確なテーブルに移動する前にさらに分析する場合に備えて[dbo].[Query]、そのままにするか、カスタムTable名のままにすることをお勧めします。

次に、[次へ] / [完了]ボタンをクリックして、ウィザードの最後に進みます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.