Importovanie súboru CSV do servera SQL Server

Hľadám pomoc na importovanie súboru .csv do SQL Servera pomocou BULK INSERT a mám niekoľko základných otázok.

Problémy:

  1. Údaje v súbore CSV môžu mať medzi sebou , (čiarku) (napr.: popis), takže ako môžem vykonať import, ktorý tieto údaje spracuje?

  2. Ak klient vytvorí CSV z Excelu, potom sú údaje, ktoré majú čiarku, uzavreté v "" (dvojitých úvodzovkách) [ako je uvedené v nasledujúcom príklade], takže ako si s tým môže import poradiť?

  3. Ako môžeme sledovať, či niektoré riadky majú zlé údaje, ktoré import preskočí? (či import preskočí riadky, ktoré sa nedajú importovať)

Tu je vzor CSV s hlavičkou:

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.

A príkaz SQL na import:

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
)
Riešenie

Import CSV na základe servera SQL Server

  1. Údaje v súbore CSV môžu mať medzi sebou , (čiarka) (napr: popis), ako teda môžem vykonať import týchto údajov?

Riešenie

Ak používate , (čiarku) ako oddeľovač, potom neexistuje spôsob, ako rozlíšiť čiarku ako ukončovač poľa a čiarku v údajoch. Použil by som iný FIELDTERMINATOR, napríklad ||. Kód by vyzeral takto a tento bude dokonale spracovávať čiarku a jednoduché lomítko.

  1. Ak klient vytvorí csv z Excelu, potom údaje, ktoré majú čiarku, sú uzavreté do " ... " (dvojité úvodzovky) [ako je uvedené nižšie príklad], tak ako si s tým import dokáže poradiť?

Riešenie

Ak'používate BULK insert, potom neexistuje spôsob, ako spracovať dvojité úvodzovky, údaje budú vložené s dvojitými úvodzovkami do riadkov. Po vložení údajov do tabuľky by ste mohli tieto dvojité úvodzovky nahradiť pomocou '` `'.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
  1. Ako môžeme sledovať, či niektoré riadky majú zlé údaje, ktoré import preskočí? (či import preskočí riadky, ktoré sa nedajú importovať)?

Riešenie

Na ošetrenie riadkov, ktoré sa do tabuľky nenačítajú z dôvodu neplatných údajov alebo formátu, by sa mohlo spracovať pomocou vlastnosti ERRORFILE, zadajte názov chybového súboru, zapíše riadky Kód by mal vyzerať takto.

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áre (5)

Najlepší, najrýchlejší a najjednoduchší spôsob, ako vyriešiť problém s čiarkou v údajoch, je použiť program Excel na uloženie súboru oddeleného čiarkou po nastavení oddeľovača zoznamu systému Windows na niečo iné ako čiarka (napríklad fajku). Tým sa vytvorí súbor oddelený čiarkou (alebo iným spôsobom), ktorý potom môžete importovať. Tento postup je popísaný tu.

Komentáre (0)

Najprv je potrebné importovať súbor CSV do tabuľky údajov

Potom môžete vložiť hromadné riadky pomocou 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áre (1)