CSV dosyasını SQL Server'a aktarma

Bir .csv dosyasını BULK INSERT kullanarak SQL Server'a aktarmak için yardım arıyorum ve birkaç temel sorum var.

Sorunlar:

  1. CSV dosyası verileri arasında , (virgül) olabilir (Örn: açıklama), bu nedenle bu verileri işleyerek içe aktarmayı nasıl yapabilirim?

  2. Müşteri CSV'yi Excel'den oluşturursa, virgül içeren veriler "" (çift tırnak) içine alınır [aşağıdaki örnekte olduğu gibi], bu nedenle içe aktarma bunu nasıl işleyebilir?

  3. Bazı satırlarda içe aktarmanın atladığı kötü veriler olup olmadığını nasıl izleriz? (içe aktarma, içe aktarılamayan satırları atlar mı)

İşte başlığıyla birlikte örnek 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.

Ve içe aktarılacak SQL deyimi:

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
)
Çözüm

Tabanlı SQL Server CSV İçe Aktarma

  1. CSV dosyası verileri arasında , (virgül) olabilir (Örn: description), bu yüzden bu verileri işleyerek içe aktarmayı nasıl yapabilirim?

Çözüm

Ayırıcı olarak , (virgül) kullanıyorsanız, alan sonlandırıcı olarak virgül ile verilerinizdeki virgül arasında ayrım yapmanın bir yolu yoktur. Ben olsam || gibi farklı bir FIELDTERMINATOR kullanırdım. Kod şöyle görünecektir ve bu virgül ve tek eğik çizgiyi mükemmel bir şekilde işleyecektir.

  1. Müşteri csv'yi excel'den oluşturursa, sahip olduğu veriler virgül " ... " (çift tırnak) içine alınır [aşağıdaki gibi örnek] peki ithalat bunu nasıl halledebilir?

Çözüm

BULK insert kullanıyorsanız, çift tırnak işaretlerini işlemenin bir yolu yoktur, veriler satırlara çift tırnak ile eklenir. Verileri tabloya ekledikten sonra bu çift tırnak işaretlerini '``' ile değiştirebilirsiniz.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
  1. Bazı satırlarda içe aktarmanın atladığı kötü veriler olup olmadığını nasıl izleriz? (içe aktarılamayan satırları atlar mı)?

Çözüm

Geçersiz veri veya biçim nedeniyle tabloya yüklenmeyen satırları işlemek için ERRORFILE özelliğini]1 kullanarak işleyin, hata dosyası adını belirtin, satırları yazacaktır hata dosyasında hata olması. kod şöyle görünmelidir.

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
    )
Yorumlar (5)

Verilerdeki virgül sorununu çözmenin en iyi, en hızlı ve en kolay yolu, Windows' liste ayırıcı ayarını virgülden başka bir şeye (boru gibi) ayarladıktan sonra virgülle ayrılmış bir dosyayı kaydetmek için Excel'i kullanmaktır. Bu daha sonra sizin için içe aktarabileceğiniz bir boru (veya her neyse) ile ayrılmış dosya oluşturacaktır. Bu burada açıklanmıştır.

Yorumlar (0)

İlk olarak CSV dosyasını Veri Tablosuna aktarmanız gerekir

Ardından SQLBulkCopy kullanarak toplu satırlar ekleyebilirsiniz

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);
                }
            }
        }
    }
}
Yorumlar (1)