Импортиране на CSV файл в SQL Server

Търся помощ, за да импортирам файл .csv в SQL Server с помощта на BULK INSERT и имам няколко основни въпроса.

Въпроси:

  1. Данните в CSV файла могат да съдържат , (запетая) между тях (напр.: описание), така че как мога да направя импорт, обработващ тези данни?

  2. Ако клиентът създаде CSV файла от Excel, тогава данните, които имат запетая, се затварят в "" (двойни кавички) [както в примера по-долу], така че как импортът може да се справи с това?

  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
)
Решение

Импортиране на CSV на базата на SQL Server

  1. Данните в CSV файла могат да имат , (запетая) между тях (напр: описание), така че как мога да направя внос, обработващ тези данни?

Решение

Ако използвате , (запетая) като разделител, тогава няма как да разграничите запетаята като терминатор на полето и запетаята в данните. Бих използвал друг FIELDTERMINATOR, например ||. Кодът би изглеждал по следния начин и той ще се справи перфектно със запетаята и единичната наклонена черта.

  1. Ако клиентът създаде csv от Excel, тогава данните, които имат запетайка, се затварят в " ... " (двойни кавички) [както по-долу пример], така че как импортът може да се справи с това?

Решение

Ако използвате BULK insert, тогава няма как да се справите с двойните кавички, данните ще бъдат ще бъдат вмъкнати с двойни кавички в редовете. След като вмъкнете данните в таблицата, можете да замените тези двойни кавички с '` `'.

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')
  1. Как да проследим дали някои редове имат лоши данни, които импортът пропуска? (прескача ли импортът редове, които не могат да бъдат импортирани)?

Решение

За да се справят редовете, които не се зареждат в таблицата поради невалидни данни или формат, може да се да се обработи с помощта на свойството ERRORFILE, посочете името на файла за грешки, той ще запише редовете кодът трябва да изглежда така.

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
    )
Коментари (5)

Най-добрият, най-бързият и най-лесният начин за решаване на проблема със запетаята в данните е да използвате Excel, за да запишете файл, разделен със запетая, след като сте задали настройка на разделителя на списъци в Windows' на нещо различно от запетая (например тръба). Това ще генерира за вас файл, разделен с тръба (или какъвто и да е друг файл), който можете да импортирате. Това е описано тук.

Коментари (0)

Първо трябва да импортирате 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)