CSV failo importavimas į SQL serverį

Ieškau pagalbos, kaip importuoti .csv failą į SQL serverį naudojant BULK INSERT ir turiu keletą pagrindinių klausimų.

Aplinkybės:

  1. CSV failo duomenyse tarp jų gali būti , (kablelis) (pvz.: aprašymas), todėl kaip importuoti šiuos duomenis?

  2. Jei klientas sukuria CSV failą iš "Excel", tuomet duomenys, kuriuose yra kablelis, yra uždaromi į "" (dvigubas kabutes) [kaip toliau pateiktame pavyzdyje], tad kaip importuoti?

  3. Kaip sekti, ar kai kuriose eilutėse yra blogų duomenų, kuriuos importas praleidžia? (ar importas praleidžia eilutes, kurių negalima importuoti)?

Čia pateikiamas CSV pavyzdys su antraštėmis:

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.

Ir importuoti skirtas SQL sakinys:

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
)
Sprendimas

SQL serverio CSV importas

  1. CSV failo duomenys gali turėti , (kablelį) tarp jų (pvz: aprašymas), todėl kaip galiu importuoti šiuos duomenis?

Sprendimas

Jei kaip skirtuką naudojate , (kablelį), tuomet nėra jokio būdo atskirti kablelį kaip lauko terminatorių nuo kablelio jūsų duomenyse. Aš naudočiau kitą POLO TERMINATORIŲ, pavyzdžiui, ||. Kodas atrodytų taip, ir tai puikiai tvarkys kablelį ir vieną pasvirąjį brūkšnį.

  1. Jei klientas sukuria csv iš "Excel", tada duomenys, kurie turi kablelį, yra pateikiami " ... " (dvigubos kabutės) [kaip toliau pavyzdys], tad kaip importas gali su tuo susidoroti?

Sprendimas

Jei naudojate BULK insert, tuomet nėra jokio būdo tvarkyti dvigubas kabutes, duomenys bus į eilutes bus įterpiami su dvigubomis kabutėmis. Įterpę duomenis į lentelę, galite pakeisti šias dvigubas kabutes žodžiais '` `'.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
  1. Kaip sekti, ar kai kuriose eilutėse yra blogų duomenų, kuriuos importas praleidžia? (ar importas praleidžia eilutes, kurių negalima importuoti)?

Sprendimas

Tvarkyti eilutes, kurios neįkeliamos į lentelę dėl neteisingų duomenų ar formato, galima taip tvarkyti naudojant savybę ERRORFILE, nurodykite klaidų failo pavadinimą, jis įrašys eilutes kodas turėtų atrodyti taip.

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

Geriausias, greičiausias ir paprasčiausias būdas išspręsti kablelio problemą duomenyse - naudoti "Excel" ir išsaugoti kableliu atskirtą failą, nustačius "Windows" sąrašo skirtuko parametrą, kuris nėra kablelis (pvz., vamzdelis). Taip bus sukurtas vamzdžiu (ar bet kaip kitaip) atskirtas failas, kurį galėsite importuoti. Tai aprašyta čia.

Komentarai (0)

Pirmiausia reikia importuoti CSV failą į duomenų lentelę

Tada galite įterpti daug eilučių naudodami 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);
                }
            }
        }
    }
}
Komentarai (1)