web-dev-qa-db-ja.com

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

.csvを使用してBULK INSERTファイルをSQL Serverにインポートするためのヘルプを探していますが、基本的な質問はほとんどありません。

問題:

  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
)
157
Prabhat

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
    )
140
mr_eclair

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

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

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

Next >ボタンをクリック

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

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

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

Run immediatelyチェックボックスをチェックしてNext >ボタンをクリックしてください。

•パッケージを実行するにはFinishボタンをクリックしてください。

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

24
Zd8n8k

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
)
15
Oleg

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

9
Sachin Kainth

SQL Server Management Studioを使用してCSVファイルをデータベースにインポートします。

  1. まず、データベースにCSVファイルをインポートするテーブルを作成します。
  2. SQL Server Management Studioを使用してデータベースにログインします。
  3. データベースを右クリックして、「タスク」 - >「データのインポート...」を選択します。
  4. Next>ボタンをクリックしてください。
  5. データソースにフラットファイルソースを選択します。次に[参照]ボタンを使用してCSVファイルを選択します。 [次へ>]ボタンをクリックする前に、データのインポートを設定してください。
  6. [Destination]に、正しいデータベースプロバイダーを選択します(たとえば、SQL Server 2012の場合は、SQL Server Native Client 11.0を使用できます)。サーバー名を入力してください。 [次へ>]ボタンをクリックする前に、[SQL Server認証を使用する]を選択し、[ユーザー名]、[パスワード]、および[データベース]を入力します。
  7. 「ソース表とビューの選択」ウィンドウでは、「次へ>」ボタンをクリックする前にマッピングを編集できます。
  8. すぐに実行をチェックして、次へ>ボタンをクリックします。
  9. [完了]ボタンをクリックしてパッケージを実行してください。

参照

7
Somnath Muluk

これを解決する方法は次のとおりです。

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

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

  3. インポートマネージャでカスタムスクリプトを作成して、探しているデータを省略または変更します(または、削除したいデータを詳細に調べるためにマスタースクリプトを実行します)。

がんばろう。

3
Zee

あなたはデータテーブルに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);
                }
            }
        }
    }
}
2
kombsh

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

enter image description here

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

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

フラットファイルソース

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

  1. [次へ]をクリックし、最後のオプションで選択します

SQLクライアント

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

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

ID挿入を有効にする

(通常は1からは開始しません)代わりに、CSVにidを持つ列がある場合、enable id insertを選択します。次のステップはウィザードを終了することです。ここで変更を確認できます。

一方、次のウィンドウには警告が表示される場合があります。または、警告は、注意を払うためにエラーを残す必要がある場合にのみ、これを無視することです

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

1
jarvis24

最初にExcelを開き、次にDATAに進み、TXT Fileからインポートし、接頭辞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ではサポートされていないようです。

0
Steve Yo