CSV faila importēšana SQL Serverī

Es meklēju palīdzību, lai importētu .csv failu SQL Serverī, izmantojot BULK INSERT, un man ir daži pamatjautājumi.

Problēmas:

  1. CSV faila datos var būt , (komats) (piem.: apraksts), tāpēc kā es varu veikt šo datu importēšanu?

  2. Ja klients izveido CSV failu no Excel, tad dati, kuros ir komats, ir ietverti "" (dubultās pēdiņās) [kā tālāk dotajā piemērā], tad kā importēt, lai to apstrādātu?

  3. Kā izsekot, vai dažās rindās ir slikti dati, kurus imports izlaiž? (vai imports izlaiž rindas, kuras nav importējamas)?

Šeit ir CSV paraugs ar galveni:

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.

Un SQL paziņojums importēšanai:

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
)
Risinājums

Pamatojoties uz SQL Server CSV importēšanu

  1. CSV faila datos var būt , (komats) starp (piem: apraksts), tāpēc kā es varu veikt šo datu apstrādi?

risinājums

Ja kā norobežotāju izmantojat , (komatu), tad nav iespējams atšķirt komatu kā lauka terminatoru no komata jūsu datos. Es izmantotu citu FIELDTERMINATORU, piemēram, ||. Kods izskatītos šādi, un tas lieliski apstrādās komatu un vienu slīpsvītru.

  1. Ja klients izveido csv no Excel, tad dati, kuriem ir komatu, tiek ietverti " ... " (dubultās pēdiņās) [kā tālāk tekstā]. piemērs], tad kā ar to var tikt galā ar importu?

risinājums

Ja izmantojat BULK insert, tad nav iespējams apstrādāt dubultās pēdiņas, dati būs rindās tiks iestarpināti ar dubultajām pēdiņām. Pēc datu ievietošanas tabulā jūs varētu aizstāt šīs dubultās pēdiņas ar '` `'.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
  1. Kā izsekot, vai dažās rindās ir slikti dati, kurus imports izlaiž? (vai imports izlaiž rindas, kuras nav importējamas)?

risinājums

Lai apstrādātu rindas, kas netiek ielādētas tabulā nederīgu datu vai formāta dēļ, varētu būt šādi apstrādāt, izmantojot ERRORFILE īpašību, norādiet kļūdas faila nosaukumu, tas ierakstīs rindas. kods izskatās šādi.

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
    )
Komentāri (5)

Labākais, ātrākais un vienkāršākais veids, kā atrisināt komatu datu atdalīšanas problēmu, ir izmantot Excel, lai saglabātu ar komatu atdalītu failu pēc tam, kad ir iestatīts Windows' saraksta atdalītāja iestatījums, kas nav komats (piemēram, caurule). Tādējādi tiks izveidots ar cauruli (vai jebkuru citu elementu) atdalīts fails, kuru pēc tam varēsiet importēt. Tas ir aprakstīts šeit.

Komentāri (0)

Vispirms jums ir nepieciešams importēt CSV failu datu tabulā.

Pēc tam varat ievietot masveida rindas, izmantojot 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);
                }
            }
        }
    }
}
Komentāri (1)