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

Я ищу помощь для импорта файла .csv в SQL Server с помощью BULK INSERT, и у меня есть несколько основных вопросов.

Проблемы:

  • Данные файла CSV могут иметь , (запятая) между (Ex: description), поэтому как я могу импортировать данные этих данных?

  • Если клиент создает CSV из Excel, тогда данные, имеющие запятую, заключены в "" (двойные кавычки) [в качестве примера ниже], так как импорт может справиться с этим?

  • Как мы отслеживаем, есть ли у некоторых строк плохие данные, которые импортируются? (импорт импортирует строки, которые не являются импортируемыми)

Вот пример 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 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
)

Ответ 1

Импорт CSV на основе SQL Server

1) Данные файла CSV могут иметь , (запятая) между (Ex: описание), так как я могу сделать импорт обработки этих данных?

Решение

Если вы используете , (запятая) в качестве разделителя, тогда нет возможности различать запятую как терминатор поля и запятую в ваших данных. Я бы использовал другой FIELDTERMINATOR как ||. Код будет выглядеть так, и это отлично справится с запятой и одиночной косой чертой.

2) Если клиент создает csv из excel, то данные, которые имеют запятые заключены в " ... " (двойные кавычки) [как показано ниже пример], так как импорт может справиться с этим?

Решение

Если вы используете BULK-вставку, тогда невозможно обработать двойные кавычки, данные будут вставлен с двойными кавычками в строки. после вставки данных в таблицу вы можете заменить эти двойные кавычки на "".

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')

3) Как мы отслеживаем, если в некоторых строках есть плохие данные, импорт которых пропускает? (делает импорт пропускает строки, которые не являются импортируемыми)?

Решение

Для обработки строк, которые не загружаются в таблицу из-за неверных данных или формата, может быть используя свойство 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
    )

Ответ 2

Самый лучший, самый быстрый и простой способ разрешить запятую в проблеме данных - использовать Excel для сохранения файла с разделителями-запятыми после установки параметра разделителя списков Windows на нечто, отличное от запятой (например, на трубе). Затем вы создадите для вас отдельный файл (или любой другой), который вы можете импортировать. Это описано здесь.

Ответ 3

Импорт CSV файла в базу данных с помощью SQL Server Management Studio.

  • Сначала создайте таблицу в своей базе данных, в которую вы импортируете CSV файл.
  • Войдите в свою базу данных с помощью SQL Server Management Studio.
  • Щелкните правой кнопкой мыши базу данных и выберите "Задачи → Импорт данных...
  • Нажмите кнопку "Далее".
  • Для источника данных выберите "Плоский файл". Затем используйте кнопку "Обзор", чтобы выбрать файл CSV. Потратьте некоторое время на настройку импорта данных, прежде чем нажимать кнопку "Далее".
  • В поле "Назначение" выберите нужного поставщика базы данных (например, для SQL Server 2012 вы можете использовать собственный клиент SQL Server 11.0). Введите имя сервера; проверьте Использовать проверку подлинности SQL Server, введите имя пользователя, пароль и базу данных, прежде чем нажать кнопку "Далее".
  • В окне "Выбор исходных таблиц и представлений" вы можете редактировать сопоставления перед нажатием кнопки "Далее".
  • Немедленно проверьте Run Run и нажмите кнопку Next > .
  • Нажмите кнопку "Готово", чтобы запустить пакет.

Ссылка

Ответ 4

Чтобы импортировать 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 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);
                }
            }
        }
    }
}

Ответ 5

Вот как бы я решил:

  • Просто сохраните свой CSV файл в виде листа XLS в excel (сделав это, вам не придется беспокоиться о разделителях. Формат электронной таблицы Excel будет считан как таблица и импортирован непосредственно в таблицу SQL)

  • Импортировать файл с помощью службы SSIS

  • Напишите пользовательский Script в диспетчере импорта, чтобы опустить/изменить данные, которые вы ищете. (Или запустить мастер Script для тщательного анализа данных, которые вы хотите удалить)

Удачи.

Ответ 6

2) Если клиент создает csv из excel, то данные, которые имеют запятые заключены в "..." (двойные кавычки) [как показано ниже пример], так как импорт может справиться с этим?

Вы должны использовать FORMAT = 'CSV', FIELDQUOTE = '"' опции:

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FORMAT = 'CSV', 
    FIELDQUOTE = '"',
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)