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


186

Я ищу помощь для импорта .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

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

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
Спасибо за помощь. Reg Решение № 1: Можем ли мы создать || Отдельный файл значений из Excel? Потому что около 20% исходных файлов создаются с помощью Excel клиентом.
Прабхат

@Prabhat Как вы загружаете файлы Excel в SQL Server?
Вишванат Дальви,

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

Если у вас есть влияние на то, как клиент создает файлы CSV из Excel, вы можете научить их, как устанавливать символ-разделитель в Excel (и, более того, это больше не файл, разделенный запятыми, он будет разделен символом (|), например. Учитывая обручи, которые вы перепрыгиваете для этого, и если у вас есть SSIS - я рекомендую вам проверить его. Версии SQL Server 2012 и более поздние версии имеют очень надежный конструктор SSIS (также в VS 2012 и более поздних версиях), который бы Позвольте вашему клиенту просто отправить вам файлы Excel вместо CSV.
qxotk

Я не уверен, что это совершенно точно. Вы можете иметь дело с двойными кавычками в SQL Bulk Insert. В этой теме имеется переполнение стека, и можно использовать файлы форматов для обучения переменным разделителям 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 вы можете использовать собственный клиент SQL Server 11.0). Введите имя сервера. Проверьте Use SQL Server Authenticationпереключатель. Введите имя пользователя, пароль и базу данных, прежде чем нажать на Next >кнопку.

• В окне «Выбор исходных таблиц и представлений» вы можете редактировать сопоставления перед нажатием Next >кнопки.

• Установите Run immediatelyфлажок и нажмите Next >кнопку.

• Нажмите на Finishкнопку, чтобы запустить пакет.

Вышеуказанное было найдено на этом сайте (я использовал его и протестировал):


30
Было бы хорошо, если бы вы дали
SierraOscar

1
Нет необходимости предварительно создавать таблицу, она может быть создана во время процесса импорта
bside

1
Мне нравится, что вы просто вырезали и вставляли с веб-страницы очень полезную строку «Потратьте некоторое время на настройку того, как вы хотите, чтобы данные импортировались» . Это было все, что я искал: я, кажется, не могу настроить это вообще!
Auspex

Да, и «переключатель« Использовать проверку подлинности SQL Server » неправильный», поскольку вы вполне можете захотеть использовать проверку подлинности Windows. Это работает для вас.
Auspex

Спасибо, что нашли пошаговую процедуру с изображениями для реализации описанной выше процедуры, стоит посмотреть: qawithexperts.com/article/sql/…
user3559462

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, но если бы вы прочитали сценарий OP, у него было несколько особых сценариев, особенно с разделителями, которые не являются проблемой для листов xls. Обычно такие особые сценарии, как эти, не требуют обширного решения, но исправления, которое сохраняет данные. При загрузке файла SSIS позволяет выбирать отображение данных между исходной и целевой таблицами, что опять же облегчает необходимые усилия. Вот почему этот метод был предложен как быстрый взлом.
Зи

1
SSIS уже может обрабатывать текстовые разделители CSV. В любом случае, если вы используете SSIS, у меня возникнут проблемы с сохранением CSV в виде XLS, просто мне кажется, что это может привести к поломке без причины.
NReilingh

Кроме того, у меня обычно есть файлы CSV, слишком большие для Excel.
Auspex

3

Поскольку они не используют мастер импорта SQL, шаги будут следующими:

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

  1. Щелкните правой кнопкой мыши базу данных в опциях задач для импорта данных,

  2. Когда мастер открыт, мы выбираем тип данных, которые должны подразумеваться. В этом случае это будет

Источник плоского файла

Мы выбираем файл CSV, вы можете настроить тип данных таблиц в CSV, но лучше всего взять его из CSV.

  1. Нажмите Далее и выберите в последнем варианте, который

Клиент SQL

В зависимости от нашего типа аутентификации мы выбираем его, как только это будет сделано, появится очень важная опция.

  1. Мы можем определить идентификатор таблицы в CSV (рекомендуется, чтобы столбцы CSV назывались так же, как поля в таблице). В опции Edit Mappings мы можем видеть предварительный просмотр каждой таблицы со столбцом электронной таблицы, если мы хотим, чтобы мастер вставил id по умолчанию, мы оставляем эту опцию не отмеченной.

Включить вставку идентификатора

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

С другой стороны, в следующем окне могут появиться предупреждения или предупреждения, в идеале лучше игнорировать это, только если они оставляют ошибку , необходимо обратить внимание.

Эта ссылка имеет изображения .


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
  • EF CODE-FIRST ПОДХОД
  • SSMS
  • EXCEL

СЦЕНАРИЙ Я загружал набор данных в формате 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) После нажатия Next , вы должны выбрать Destionation .
Для этого снова выберите «Собственный клиент SQL Server».
На этот раз вы можете предоставить свой местный (или какой-то другой внешний DB) DB.

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

4) После нажатия кнопки «Далее» у вас есть два варианта: скопировать всю таблицу из одной DBв другую или записать запрос, чтобы указать точные данные для копирования. В моем случае мне нужна была не вся таблица (она была слишком большой), а лишь некоторая ее часть, поэтому я выбрал «Написать запрос, чтобы указать данные для передачи».

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

Я бы предложил записать и протестировать запрос в отдельном редакторе запросов, прежде чем переходить в Wizard.

5) И, наконец, вам нужно указать таблицу назначения, где будут выбраны данные.

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

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

А теперь перейдите прямо к концу мастера, нажав кнопки Далее / Готово .


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.