Простой способ импортировать CSV в SQL Server с кавычками в полях - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь импортировать файл CSV, который содержит запятые и кавычки в полях, в базу данных SQL Server.В Интернете около миллиона вопросов и тем, но ни одна из них не работает.Я понял, что когда дело доходит до CSV, существуют немного другие стандарты, но SSMS, похоже, тоже не может импортировать, и я чувствую, что действительно должен быть удобный способ.

Файлысодержат строки произвольного текста, где они используют как двойные кавычки, так и запятые в полях

Вот тестовый файл CSV, который я использую:

"Value 1","Notes"
""8-pooln" grupp 7:6 To11:13","As extracted"
"""8-pooln"" grupp 7:6 To11:13","With escaped quotes"
"""""""""""8-pooln"""""""""""""""" grupp 7:6 To11:13","With loads of quotes"

Я использовал стороннюю программу для извлечения данных в CSV.Итак, первая запись - как я получил ее из этой программы.Согласно некоторым сайтам, вам нужно избегать двойных кавычек в поле, добавив еще одну двойную кавычку, это то, что вы видите в записи 2. Последняя просто содержит множество из них для тестирования.Я также использовал другое приложение для проверки файла как CSV, где проходят 2-ю и 3-ю записи.

Используя мастер импорта SSMS, я получаю:

_Value_1_,_Notes_
8-pooln" grupp 7:6 To11:13,As extracted
8-pooln"" grupp 7:6 To11:13,With escaped quotes
8-pooln"""""""""""""""" grupp 7:6 To11:13,With loads of quotes

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

Я также пытался вручную написать команду SQL, такую ​​как:

BULK INSERT CSVTest
FROM 'c:\csvtest.txt'
WITH
    (FIELDTERMINATOR = ',',
     ROWTERMINATOR = '\n')

, которая дает нам:

Value_1,Notes
"Value 1","Notes"
""8-pooln" grupp 7:6 To11:13","As extracted"
"""8-pooln"" grupp 7:6 To11:13","With escaped quotes"
"""""""""""8-pooln"""""""""""""""" grupp 7:6 To11:13","With loads of quotes"

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

Наконец, я нашел какое-то решение, в котором вы можетенапишите «файл формата», где вы можете определить разделитель столбцов для каждого столбца вручную.Что, вероятно, будет работать, но у меня есть более 50 столбцов для одного файла и около 20 файлов.

Я также нашел возможное решение в настройках мастера импорта SSMS, но оно для старой версии и, похоже, его больше не существует.

Чтобы уточнить:

  • Поля содержат как запятые, так и двойные кавычки, поэтому двойные кавычки открывают и закрывают поля.Я скорее ничего не изменяю (например, из двойных в одинарные кавычки), так как не знаю точно, что означают значения.
  • Существует около 20 файлов, один из которых содержит 95000 записей и более 50 столбцов.Создание форматных файлов кажется неоправданным.
  • Это не так уж плохо отформатированные файлы.Интуитивно понятно, что SSMS должна иметь возможность импортировать это без каких-либо исправлений.Может быть, я могу жить с ручным редактированием CSV-файла, чтобы он соответствовал стандартам (как я сделал со 2-й записью в моем тестовом файле).

На данный момент я просто счастлив понять, почему этопросто не работает или почему моя проблема кажется уникальной.

1 Ответ

0 голосов
/ 06 декабря 2018

Я не уверен, что использование SSIS - это вариант для вас, но если это так, импортировать данные с кавычками в текстовые поля было бы довольно легко.Обзор этого процесса приведен ниже.

  • Создайте соединение OLE DB с экземпляром SQL Server, где находится таблица назначения.Это можно сделать, щелкнув правой кнопкой мыши в окне Диспетчеры соединений, выбрав Новое соединение ... и выбрав опцию OLE DB.Сконфигурируйте учетные данные для входа и начальный каталог, в который будут загружаться данные.
  • Затем создайте диспетчер соединений с плоскими файлами.В поле «Имя файла» перейдите к существующей папке и выберите пример файла данных.Если вы не видите файл, измените расширение файла на все файлы в проводнике.Выберите Delimited для поля Формат и отметьте опцию «Имена столбцов в первой строке данных», если это относится к вашему файлу.Установите соответствующий заголовок строки заголовка.Судя по вашему примеру, я предполагаю, что вы бы использовали комбинацию возврата каретки / строки, которая является значением {CR}{LF}.
  • На панели «Столбцы» установите соответствующий разделитель строк, что такжекажется {CR}{LF} из вашего образца.Для разделителя столбцов используйте ,.Это будет применяться ко всем столбцам в файле, поэтому вам не нужно будет устанавливать это для каждого поля.Я не могу сказать по вашему вопросу, но если , разделяет все поля, используйте эту опцию, в противном случае введите Mixed в качестве разделителя столбцов.Эта опция может не отображаться в раскрывающемся списке, но ее привязка позволит вам использовать разные разделители для каждого столбца.Подробнее об этом см. Ниже:

  • На панели «Дополнительно» добавьте имена, типы данных и длины столбцов.Если вы не уверены, какие типы данных SSIS соответствуют SQL Server, посмотрите таблицу сопоставлений в этой ссылке , которая показывает, какие типы данных связаны друг с другом.Если вы использовали опцию Mixed выше, здесь вы можете установить разделитель в поле ColumnDelimiter для каждого столбца.Вы также можете ввести значения здесь.Например, если поля всегда будут разделяться определенной комбинацией символов, это также можно использовать.

  • После создания диспетчера соединений создайте задачу потока данных и в нейдобавить компонент источника плоских файлов.Используйте менеджер соединений, который вы только что создали для менеджера соединений этого компонента.

  • Затем добавьте назначение OLE DB или SQL Server.Я обнаружил, что назначение SQL Server, как правило, работает лучше, но, конечно, это может варьироваться в разных средах.Используйте диспетчер соединений OLE DB, созданный для конечного экземпляра SQL Server, и сопоставьте столбцы на панели сопоставлений.Подключитесь к источнику плоских файлов к месту назначения SQL Server, и теперь вы можете загружать данные в свою таблицу из исходного файла.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...