Подтвердить что ты не робот

Массовая вставка правильно скопированного CSV файла в SQL Server

Я пытаюсь импортировать правильно цитируемый CSV файл, то есть данные цитируются только в том случае, если они содержат запятую, например:

41, Terminator, Black
42, "Monsters, Inc.", Blue

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

Я видел такие предложения, как этот

SQL Bulk import из CSV

чтобы изменить терминатор поля

FIELDTERMINATOR = ' ""'

Однако мой CSV файл только цитирует поля, которые ему нужны, поэтому я не верю, что предложение будет работать.

Может ли оператор SQL Server BULK IMPORT импортировать правильно цитируемый CSV файл? Как?

4b9b3361

Ответ 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 и установите его как '.'.

Ответ 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;

Ответ 8

В спецификации формата CSV я не думаю, что это важно, если данные правильно цитируются или нет, если они соответствуют спецификации. Чрезмерные кавычки должны обрабатываться синтаксическим анализатором, если он правильно реализован. FIELDTERMINATOR должен быть запятой, а ROWTERMINATOR - конец строки - это означает стандартный CSV файл. Вы пытались импортировать данные с этими настройками?