Імпортуйте файл CSV на SQL Server


185

Я шукаю допомоги, щоб імпортувати .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
)

Може бути SSMS: Як імпортувати (скопіювати / вставити) дані з excel може допомогти (Якщо ви не хочете використовувати BULK NSERTабо не маєте дозволів на це).
Денис

Відповіді:


169

На основі імпорту CSV на SQL Server

1) Дані файлу CSV можуть містити ,(кома) між (наприклад: опис), тож як я можу зробити імпорт, обробляючи ці дані?

Рішення

Якщо ви використовуєте ,(кома) як роздільник, то у ваших даних немає можливості розмежувати кому як польовий термінатор і кому. Я б використав інший 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
    )

1
Дякую за допомогу. Зареєструйте рішення №1: Чи можемо ми створити || відокремлений файл значення від Excel? Тому що близько 20% вихідних файлів створюються за допомогою клієнта Excel.
Прабхат

@Prabhat Як ви завантажуєте файли Excel у SQL Server?
Vishwanath Dalvi

Це не файли Excel, які я завантажую. Клієнт використовує Excel для створення файлів .CSV (для 20% вихідних даних, які імпортує наша програма). І я запитав, чи ми створюємо CSV-файли за допомогою Excel, як у нас || як роздільник значення стовпця?
Прабхат

Якщо ви впливаєте на те, як клієнт створює CSV-файли з Excel, ви можете навчити їх встановлювати символ роздільника в Excel (і, ну, це вже не відокремлений файл «комами», це буде відокремлено pipe (|), Наприклад, враховуючи обручі, через які ви переходите, і якщо у вас SSIS - я рекомендую вам перевірити його. Версії SQL Server 2012 і пізніших версій мають дуже надійний дизайнер SSIS (також у VS 2012 та пізніших версіях), який би дозвольте вашому клієнту просто надсилати вам файли excel замість csv.
qxotk

Я не впевнений, що це абсолютно точно. Ви можете мати подвійні лапки в SQL Bulk Insert. На цю тему є переповнення стека, і ви можете використовувати файли формату, щоб навчити групову вставку різними роздільниками. stackoverflow.com/questions/25726385 / ... advancesharp.com/blog/1083 / ...
DtechNet

33

Спочатку потрібно створити таблицю у вашій базі даних, в яку ви будете імпортувати файл CSV. Після створення таблиці виконайте наведені нижче дії.

• Увійдіть у свою базу даних за допомогою SQL Server Management Studio

• Клацніть правою кнопкою миші на базі даних та виберіть Tasks -> Import Data...

• Натисніть Next >кнопку

• Для джерела даних виберіть Flat File Source. Потім за допомогою кнопки Огляд виберіть файл CSV. Витратьте деякий час, налаштувавши імпорт даних, перш ніж натиснути Next >кнопку.

• Для пункту призначення виберіть правильного постачальника баз даних (наприклад, для SQL Server 2012, ви можете використовувати Native Client SQL Server 11.0). Введіть ім'я сервера. Перевірте Use SQL Server Authenticationперемикач. Введіть ім'я користувача, пароль та базу даних, перш ніж натиснути Next >кнопку.

• У вікні Вибір вихідних таблиць і переглядів ви можете редагувати відображення, перш ніж натиснути Next >кнопку.

• Поставте Run immediatelyпрапорець і натисніть Next >кнопку.

• Натисніть Finishкнопку, щоб запустити пакет.

Зазначене було знайдено на цьому веб-сайті (я його використовував і тестував):


30
Було б добре, якби ви дали атрибуцію на ту сторінку, де ви скопіювали / вставили цю відповідь з ...
SierraOscar

1
Попередньо не потрібно створювати таблицю, її можна створити під час імпорту
побайте

1
Мені подобається, що ви просто вирізаєте та вставляєте з веб-сторінки за допомогою дуже корисного рядка "Проведіть деякий час, налаштувавши те, як потрібно імпортувати дані" . Це було все, що я шукав: я, здається, не зміг це налаштувати!
Auspex

О, а "Перевірити перемикач" Використовувати перемикач використання автентифікації SQL Server " невірно, оскільки ви, можливо, дуже хочете використовувати автентифікацію Windows. Це для вас працює.
Auspex

спасибі знайшли покрокову процедуру із зображеннями для здійснення вищевказаної процедури, варто подивитися: qawithexperts.com/article/sql/…
користувач3559462

23

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
)

1
Зауважте, що специфікатор FORMAT доступний лише з SQL Server 2017.
kristianp

13

Найкращий, найшвидший і найпростіший спосіб вирішити кому у питанні даних - використовувати Excel для збереження відокремленого комою файлу після встановлення налаштування роздільника списку Windows на щось інше, ніж кома (наприклад, на трубу). Після цього буде створено розділений файл для труб (або будь-який інший), який ви зможете імпортувати. Це описано тут .


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'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);
                }
            }
        }
    }
}

можливо більш зручна обгортка навколо класів BulkCopy busybulkcopy.codeplex.com
busytools

3

Ось як я це вирішив:

  1. Просто збережіть свій файл CSV як XLS-лист у excel (Зробивши це, вам не доведеться турбуватися про роздільники. Формат електронних таблиць Excel буде читатись як таблиця та імпортуватися безпосередньо в таблицю SQL)

  2. Імпортуйте файл за допомогою SSIS

  3. Напишіть користувальницький скрипт у менеджер імпорту, щоб опустити / змінити потрібні дані (або запустити головний сценарій, щоб перевірити дані, які ви хочете видалити)

Щасти.


3
Downvote: Імпорт файлів XLS за допомогою SSIS жахливий. SSIS намагатиметься відгадати типи даних даних Excel, але може здогадатися неправильно, і нічого з цим зробити не можна. Набагато краще використовувати CSV.
NReilingh

Ну, я б запропонував і csv, але якщо ви прочитали сценарій ОП, у нього були спеціальні сценарії, особливо з роздільниками, які не стосуються аркушів xls. Зазвичай такі спеціальні сценарії не потребують розгорнутого рішення, а виправлення, яке зберігає дані. Завантажуючи файл, SSIS дозволяє вибирати відображення даних між вихідними та цільовими таблицями, що знову ж таки полегшує зусилля, що докладаються. Ось чому цей метод був запропонований як швидкий злом.
Zee

1
SSIS вже може працювати з роздільниками тексту CSV. Якщо ви все-таки використовуєте SSIS, виклик проблеми з збереженням CSV як XLS спочатку просто вражає мене як додавання потенційного злому без причини.
NReilingh

Крім того, у мене звичайно є CSV файли занадто великі для Excel.
Auspex

3

Оскільки вони не використовують майстра імпорту SQL, такі дії будуть такими:

введіть тут опис зображення

  1. Клацніть правою кнопкою миші на базі даних в параметрах завдань для імпорту даних,

  2. Після відкриття майстра ми вибираємо тип даних, які слід мати на увазі. У цьому випадку це було б

Плоский джерело файлу

Вибираємо файл CSV, ви можете налаштувати тип даних таблиць у CSV, але найкраще принести його з CSV.

  1. Клацніть Далі та виберіть в останньому варіанті, який є

Клієнт SQL

Залежно від типу аутентифікації ми вибираємо його, як тільки це робиться, приходить дуже важливий варіант.

  1. Ми можемо визначити ідентифікатор таблиці в CSV (рекомендується, щоб стовпці CSV називались так само, як поля в таблиці). У опції "Редагувати відображення" ми можемо побачити попередній перегляд кожної таблиці зі стовпцем електронної таблиці, якщо ми хочемо, щоб майстер вставив ідентифікатор за замовчуванням, ми залишаємо цю опцію не встановленою.

Увімкнути вставку ідентифікатора

(як правило, не починаючи з 1), натомість якщо у CSV у нас стовпчик з ідентифікатором вибираємо вставку id id, наступним кроком є ​​завершення роботи майстра, ми можемо переглянути зміни тут.

З іншого боку, у наступному вікні можуть надходити сповіщення або попередження, ідеально - це ігнорувати це, лише якщо вони залишають помилку , потрібно звернути увагу.

Це посилання містить зображення .


0

Імпортуйте файл у Excel спочатку відкривши excel, потім перейдіть до DATA, імпортуйте з файлу TXT, виберіть розширення csv, яке збереже 0 попередньо встановлених значень, і збережіть цей стовпчик як TEXT, тому що excel упустить провідні 0 в іншому випадку (НЕ двічі клацніть відкрити в Excel, якщо у вас є числові дані в полі, починаючи з 0 [нуля]). Тоді просто збережіть як текстовий файл з розділеним текстом. Під час імпорту в excel ви отримуєте можливість зберегти як GENERAL, TEXT тощо. Виберіть TEXT, щоб цитати в середині рядка в полі, як YourCompany, LLC, також збереглися ...

BULK INSERT dbo.YourTableName
FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
WITH (
FirstRow = 2, (if skipping a header row)
FIELDTERMINATOR = '\t',
ROWTERMINATOR   = '\n'
)

Я хочу, щоб я міг використовувати функцію FORMAT і Fieldquote, але це, схоже, не підтримується в моїй версії SSMS


0

Я знаю, що є прийнята відповідь, але все ж, я хочу поділитися своїм сценарієм, який, можливо, допоможе комусь вирішити свою проблему ІНСТРУМЕНТИ

  • ASP.NET
  • КОД КОД-ПЕРШИЙ ПІДХІД
  • SSMS
  • EXCEL

SCENARIO я завантажував набір даних, що знаходиться у форматі CSV, який пізніше був показаний у представленні. Я намагався використовувати об'ємне навантаження, але не можу завантажити, як BULK LOADвикористовував

FIELDTERMINATOR = ','

окрім , того, я також використовував клітинку Excel, але я також не міг Flat file sourceбезпосередньо використовувати, оскільки я використовував Code-First Approachта робив, що робив лише модель у СБД SSMS, а не в тій моделі, з якої мені довелося потім використовувати властивості.

РІШЕННЯ

  1. Я використав джерело з плоским файлом і зробив таблицю БД з файлу CSV ( Клацніть правою кнопкою миші БД у SSMS -> Імпорт плоского файлу -> виберіть шлях CSV та виконайте всі налаштування за інструкцією )
  2. Зроблений клас класів у Visual Studio (ПОТРІБНО ЗБЕРІГАТИ всі типи даних та назви такі ж, як у файлі CSV, завантаженому в sql)
  3. використання Add-Migrationв консолі пакета NuGet
  4. Оновлення БД

0

Я знаю, що це не точне рішення вищезазначеного питання, але для мене це був кошмар, коли я намагався скопіювати дані з однієї бази даних, розташованої на окремому сервері, на мій локальний.

Я намагався це зробити, спершу експортувавши дані з Сервера, CSV/txtа потім імпортувавши їх у свою локальну таблицю.

Обидва рішення: із записом запиту на імпорт CSVабо за допомогою майстра імпорту даних SSMS завжди виникали помилки (помилки були дуже загальними, кажучи, що існує проблема розбору). І хоча я не робив нічого особливого, просто експортувати в CSVі потім намагається імпорту CSV в місцевій DB, помилки завжди були там.

Я намагався подивитися на розділ картографування та попередній перегляд даних, але завжди був великий безлад. І я знаю, що головна проблема полягала в одній із tableколонок, яка містила, JSONі SQLаналізатор ставився до цього неправильно.

Тож врешті-решт я придумав інше рішення і хочу поділитися ним у випадку, якщо у когось іншого виникне подібна проблема.


Що я зробив, це те, що я використовував майстра експорту на зовнішньому сервері.

Ось такі кроки, щоб повторити той самий процес:
1) Клацніть правою кнопкою миші на базі даних та виберітьTasks -> Export Data...

2) Коли відкриється майстер, виберіть «Далі» та на місці «Джерело даних:» виберіть «Рідний клієнт SQL Server».

введіть тут опис зображення

У випадку зовнішнього сервера, швидше за все, вам доведеться вибрати "Використовувати автентифікацію SQL Server" для "Режим автентифікації:".

3) Після натискання кнопки « Далі» ви повинні обрати рішення .
Для цього ще раз виберіть "Рідний клієнт SQL Server".
Цього разу ви можете надати свій локальний (або якийсь інший зовнішній DB) DB.

введіть тут опис зображення

4) Після натискання кнопки Next у вас є два варіанти: скопіювати всю таблицю з однієї DBв іншу або записати запит, щоб вказати точні дані, які потрібно скопіювати. У моєму випадку мені не потрібна була вся таблиця (вона була занадто великою), а лише частина її, тому я вибрав "Написати запит, щоб вказати дані для передачі".

введіть тут опис зображення

Я б запропонував записати та протестувати запит в окремому редакторі запитів, перш ніж перейти до Майстра.

5) І нарешті, вам потрібно вказати таблицю призначення, куди будуть обрані дані.

введіть тут опис зображення

Я пропоную залишити його як [dbo].[Query]або якусь власну Tableназву на випадок, якщо у вас виникнуть помилки експорту даних або якщо ви не впевнені в даних і хочете додатково проаналізувати їх, перш ніж перейти до потрібної таблиці.

А тепер переходимо прямо до кінця Майстра, натискаючи кнопки Далі / Готово .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.