.csv
を使用してBULK INSERT
ファイルをSQL Serverにインポートするためのヘルプを探していますが、基本的な質問はほとんどありません。
問題:
CSVファイルのデータの間に,
(コンマ)がある場合(例:説明)、インポートをこれらのデータをどのように処理するのですか?
クライアントがExcelからCSVを作成する場合、カンマを含むデータは""
(二重引用符)で囲まれています(以下の例のように)。インポートはこれをどのように処理できますか?
一部の行に不良データが含まれているかどうかを追跡するにはどうすればよいでしょう。 (インポートではインポートできない行はスキップされます)
ヘッダー付きのサンプル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
)
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
)
最初に、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
ボタンをクリックしてください。
上記はこの ウェブサイト で見つかりました(私はそれを使ってテストしました):
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
)
データの問題でコンマを解決するための最善、最速、最も簡単な方法は、Windowsのリスト区切り設定をコンマ以外のもの(パイプなど)に設定した後で、Excelを使用してコンマ区切りファイルを保存することです。これにより、パイプ(またはその他)で区切られたファイルが生成され、それをインポートできます。これは ここ で説明されています。
これを解決する方法は次のとおりです。
CSVファイルをExcelのXLSシートとして保存するだけです(デリミタについて心配する必要はありません。Excelのスプレッドシート形式はテーブルとして読み込まれ、SQLテーブルに直接インポートされます)。
SSISを使用してファイルをインポートする
インポートマネージャでカスタムスクリプトを作成して、探しているデータを省略または変更します(または、削除したいデータを詳細に調べるためにマスタースクリプトを実行します)。
がんばろう。
あなたはデータテーブルに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);
}
}
}
}
}
SQLインポートウィザードを使用しないため、手順は次のようになります。
オプションtasksでデータベースを右クリックしてデータをインポートします、
ウィザードが開いたら、暗示するデータのタイプを選択します。この場合、それは
フラットファイルソース
CSVファイルを選択します。CSVのテーブルのデータ型を構成できますが、CSVから取得することをお勧めします。
SQLクライアント
認証のタイプに応じて選択します。これが完了すると、非常に重要なオプションが提供されます。
ID挿入を有効にする
(通常は1からは開始しません)代わりに、CSVにidを持つ列がある場合、enable id insertを選択します。次のステップはウィザードを終了することです。ここで変更を確認できます。
一方、次のウィンドウには警告が表示される場合があります。または、警告は、注意を払うためにエラーを残す必要がある場合にのみ、これを無視することです。
最初に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ではサポートされていないようです。