Массовая вставка правильно скопированного CSV файла в SQL Server
Я пытаюсь импортировать правильно цитируемый CSV файл, то есть данные цитируются только в том случае, если они содержат запятую, например:
41, Terminator, Black
42, "Monsters, Inc.", Blue
Я замечаю, что первая строка импортирует правильно, но ошибки второй строки способом, который предлагает цитированную запятую, рассматривали как разделитель полей.
Я видел такие предложения, как этот
SQL Bulk import из CSV
чтобы изменить терминатор поля
FIELDTERMINATOR = ' ""'
Однако мой CSV файл только цитирует поля, которые ему нужны, поэтому я не верю, что предложение будет работать.
Может ли оператор SQL Server BULK IMPORT импортировать правильно цитируемый CSV файл? Как?
Ответы
Ответ 1
К сожалению, SQL Server интерпретирует указанную запятую как разделитель. Это касается как BCP, так и объемной вставки.
Из http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
Если в данных присутствует символ терминатора, он интерпретируется как терминатор, а не как данные, а данные после этого символа интерпретируется как принадлежащий к следующему полю или записи. Следовательно, тщательно выберите своих терминаторов, чтобы убедиться, что они никогда не появляются в ваших данных.
Ответ 2
Для этого есть другое решение.
Рассмотрите кавычки как часть разделителя полей, отредактировав файл fmt.
Вы можете проверить это для получения дополнительной информации:
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/02/04/how-to-remove-unwanted-quotation-marks-while-importing-a-data-file.aspx
Выдержка из ссылки выше:
Единственный способ удалить кавычки - это изменить разделители столбцов, указанные во время операции импорта. Единственный недостаток здесь состоит в том, что если вы проверите данные, которые нужно вставить, вы очень быстро поймете, что разделители столбцов различны для каждого столбца (выделенные выше разделители).
Итак, чтобы указать разные разделители столбцов для каждого столбца, вам нужно будет использовать файл формата, если вы планируете использовать Bulk Insert или BCP. Если вы создадите файл формата для указанной структуры таблицы, это будет следующим:
9.0
3
1 SQLCHAR 0 5 "\t" 1 FName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "\t" 2 LName SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 50 "\r\n" 3 Company SQL_Latin1_General_CP1_CI_AS
Измените файл формата, чтобы отобразить правильные разделители столбцов для каждого столбца. Новый файл формата, который будет использоваться, будет выглядеть следующим образом:
9.0
4
1 SQLCHAR 0 0 "\"" 0 FIRST_QUOTE SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "\",\"" 1 FNAME SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 5 "\",\"" 2 LNAME SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 50 "\"\r\n" 3 COMPANY SQL_Latin1_General_CP1_CI_AS
Ответ 3
Убедитесь, что вы включили параметр TextQualified и установите его как '.'.
Ответ 4
Вы также можете посмотреть на использование OpenRowSet с поставщиком данных текстовых файлов CSV.
Это должно быть возможно с любой версией SQL Server >= 2005, хотя вам нужно включить эту функцию.
http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/5869d247-f0a0-4224-80b3-ff2e414be402
Ответ 5
У меня была такая же проблема, и мне не хотелось идти по SSIS-маршруту, поэтому я нашел PowerShell script, который легко запускать, и обрабатывает случай кавычек с запятой в этом конкретном поле
Исходный код и DLL для PowerShell Script: https://github.com/billgraziano/CsvDataReader
Здесь блог, который объясняет использование:
http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server
Ответ 6
У меня была та же проблема, с данными, которые иногда изредка дублируют текст.
Мое решение состоит в том, чтобы позволить BULK LOAD импортировать двойные кавычки, а затем запустите REPLACE на импортированные данные.
Например:
объемная вставка CodePoint_tbl
из "F:\Data\Map\CodePointOpen\Data\CSV\ab.csv"
с (FIRSTROW = 1, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');
обновить CodePoint_tbl
set Postcode = replace (Почтовый индекс, '' ',' ')
где charindex ('"', Postcode) > 0
Чтобы сделать менее трудным записать REPLACE script, просто скопируйте и вставьте то, что вам нужно, из результатов примерно так:
select C.ColID, C.[name] as Columnname into #Columns
from syscolumns C
join sysobjects T on C.id = T.id
where T.[name] = 'User_tbl'
order by 1;
declare @QUOTE char(1);
set @QUOTE = Char(39);
select 'Update User_tbl set '+ColumnName+'=replace('+ColumnName+','
+ @QUOTE + '"' + @QUOTE + ',' + @QUOTE + @QUOTE + ');
GO'
from #Columns
where ColID > 2
order by ColID;
Ответ 7
Я потратил полдня на эту проблему. Лучше всего импортировать с помощью мастера импорта и экспорта SQL Server. В этом мастере есть настройка, которая решает эту проблему. Подробные скриншоты здесь: https://www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/ Спасибо
Ответ 8
В спецификации формата CSV я не думаю, что это важно, если данные правильно цитируются или нет, если они соответствуют спецификации. Чрезмерные кавычки должны обрабатываться синтаксическим анализатором, если он правильно реализован. FIELDTERMINATOR
должен быть запятой, а ROWTERMINATOR
- конец строки - это означает стандартный CSV файл. Вы пытались импортировать данные с этими настройками?