私は .csv
ファイルを BULK INSERT
を使用して SQL Server にインポートするためのヘルプを探しており、いくつかの基本的な質問をしています。
**問題点:***
1.CSVファイルのデータの間に,
(カンマ)がある場合(例:description)があるのですが、このようなデータを扱うインポートはどのようにすればよいでしょうか?
2.2. クライアントがExcelからCSVを作成した場合、カンマがあるデータは""
(ダブルクォート)で囲まれます(以下の例のように)ので、インポートはこれをどのように処理できますか?
3.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
)
SQL Server CSVインポートベース
,
(カンマ)が入っている場合があります(例.
このような場合、どのようにインポートすればよいのでしょうか。**解決方法
もし、区切り文字として ,
(カンマ) を使用している場合、フィールドの終端としてのカンマとデータ中のカンマを区別する方法はありません。私なら ||
のような別の FIELDTERMINATOR
を使用します。コードは次のようになり、これでカンマとシングルスラッシュを完全に扱うことができます。
" ... "
(ダブルクォート) で囲まれています。
インポートはどのように処理するのでしょうか?**解決方法
BULK insert を使用している場合、ダブルクォートを処理する方法はありません。 行にダブルクォーテーションで挿入されます。 データをテーブルに挿入した後、これらのダブルクォートを '` `' に置き換えることができます。
update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
- インポートがスキップする、いくつかの行が悪いデータを持っている場合、どのように追跡しますか? gt;(インポートできない行はインポートされない)?
**解決方法
データまたはフォーマットが無効であるためにテーブルに読み込まれなかった行を処理するには、以下の方法があります。 ERRORFILEプロパティ]1を使って、エラーファイル名を指定すると、その行を書き込むことができます。 のようなコードになります。
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を使用してデータベースにログインします。
•データベースを右クリックして、[タスク]を選択します->データのインポート。..`。
•[次へ]>ボタンをクリックします。
•データソースの場合は、[フラットファイルソース]を選択します。 次に、[参照]ボタンを使用してCSVファイルを選択します。 [次へ]>ボタンをクリックする前に、データのインポートを設定する時間をしばらく費やしてください。
•宛先の場合、正しいデータベースプロバイダーを選択します(例:. SQL Server 2012の場合、SQL Server Native Client 11.0を使用できます)。 サーバー名を入力します。 [SQL Server認証を使用する]ラジオボタンをオンにします。 [次へ]>ボタンをクリックする前に、ユーザー名、パスワード、およびデータベースを入力します。
•[ソーステーブルとビューの選択]ウィンドウで、[次へ]>ボタンをクリックする前にマッピングを編集できます。
•[すぐに実行]チェックボックスをオンにして、[次へ]>ボタンをクリックします。
•[完了]ボタンをクリックしてパッケージを実行します。
上記はこのウェブサイトで見つかりました(私はそれを使用してテストしました)。
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
)
まず、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);
}
}
}
}
}
これが私がそれを解決する方法です:
1。 CSVファイルをXLSシートとしてExcelに保存するだけです(そうすることで、区切り文字について心配する必要はありません。 Excelのスプレッドシート形式はテーブルとして読み取られ、SQLテーブルに直接インポートされます)。
2。 SSISを使用してファイルをインポートします。
3。 インポートマネージャーにカスタムスクリプトを記述して、探しているデータを省略/変更します。(または、マスタースクリプトを実行して、削除しようとしているデータを精査します)。
幸運を。
SQLインポートウィザードを使用しないため、手順は次のとおりです。
ここに画像の説明を入力してください。! 1。 オプション**タスクでデータベースを右クリックして、データをインポートします。
2。 ウィザードが開いたら、暗黙のデータのタイプを選択します。 この場合、それはです。
フラットファイルソース。
CSVファイルを選択します。CSVでテーブルのデータ型を構成できますが、CSVから取得することをお勧めします。
3。 [次へ]をクリックし、最後のオプションを選択します。
SQLクライアント。
認証の種類に応じて選択しますが、これが完了すると、非常に重要なオプションが用意されます。
4。 CSVでテーブルのIDを定義できます(CSVの列は、テーブルのフィールドと同じと呼ぶことをお勧めします)。 [マッピングの編集]オプションでは、スプレッドシートの列で各テーブルのプレビューを確認できます。ウィザードにデフォルトでIDを挿入する場合は、オプションをオフのままにします。
id挿入を有効にします。
(通常は1から開始しない)代わりに、CSVにIDのある列がある場合、有効ID挿入を選択します。次のステップは、ウィザードを終了することです。ここで変更を確認できます。
一方、次のウィンドウにはアラートが表示されることがあります。または警告は、これを無視するのが理想的です。エラーが残っている場合にのみ注意が必要です。
最初にExcelを開いて、ファイルをExcelにインポートします。, その後、データに行きます。, TXTファイルからインポートします。, 0個の接頭辞値を保持するcsv拡張を選択します。, excelはそれ以外の場合は先頭の0をドロップするため、その列を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ではサポートされていないようです。
受け入れられた答えがあることは知っていますが、それでも、誰かが問題を解決するのに役立つシナリオを共有したいと思います。 ツール。
-ASP.NET。 -EFコード-最初のアプローチ。 -SSMS。 -エクセル。
シナリオ。 後でビューに表示されるCSV形式のデータセットを読み込んでいました。 バルクロードを使用しようとしましたが、「バルクロード」を使用していたためロードできません。
FIELDTERMINATOR = ','
Excelセルも 、
を使用していました。
ただし、「Code-First Approach」を使用していて、後でプロパティを使用する必要があったモデルではなく、SSMS DBでのみモデルを作成していたため、「Flatファイルソース」を直接使用することもできませんでした。
ソリューション。
1。 フラットファイルソースを使用して、CSVファイルからDBテーブルを作成しました( SSMSで右クリックDB->フラットFIleのインポート-> CSVパスを選択し、指示どおりのすべての設定を行います)。 2。 Visual Studioでモデルクラスを作成(すべてのデータ型と名前を、SQLでロードされたCSVファイルと同じに保つ必要があります)。 3。 NuGetパッケージコンソールで「Add-Migration」を使用します。 4。 DBを更新します。