2010-08-19 5 views
3

У меня есть файл csv, который имеет значения столбцов, заключенные в двойные кавычки.Импорт CSV в SQL Server 2008

Я хочу импортировать CSV-файл из сетевого пути, используя оператор sql.

Я попробовал объемную вставку. Но он импортируется вместе с двойными кавычками. Есть ли другой способ импортировать CSV-файл в SQL Server 2008 с использованием оператора sql, игнорируя двойную кавычку текста?

Благодаря -Vivek

ответ

3

Вы можете использовать non-xml format file, чтобы указать другой разделитель на столбец. Для значений, заключенных в двойные кавычки и ограниченных вкладками, разделитель может быть \",\". Вам нужно будет добавить начальный неиспользуемый столбец для захвата первой цитаты. Например, чтобы прочитать этот файл:

"row1col1","row1col2","row1col3" 
"row2col1","row2col2","row2col3" 
"row3col1","row3col2","row3col3" 

Вы можете использовать этот формат файла:.

10.0 
4 
1 SQLCHAR 0 50 "\""  0 unused "" 
2 SQLCHAR 0 50 "\",\"" 1 col1 "" 
3 SQLCHAR 0 50 "\",\"" 2 col2 "" 
4 SQLCHAR 0 50 "\"\r\n" 3 col3 "" 

(Номер на первой линии зависит от версии SQL Server Номер на второй линии число столбцов для чтения. не забудьте настроить его.)

команда bulk insert принимает параметр formatfile = 'format_file_path', где можно указать формат файла. Например:

BULK INSERT YourTable 
FROM 'c:\test\test.csv' 
WITH (FORMATFILE = 'c:\test\test.cfmt') 

Это приводит к:

select * from YourTable 
--> 
col1  col2  col3 
row1col1 row1col2 row1col3 
row2col1 row2col2 row2col3 
row3col1 row3col2 row3col3 
+0

Будет ли это оставить вас с ведущей двойной кавычкой в ​​вашем первом поле и конечной двойной кавычкой в ​​вашем последнем поле? –

+0

@Joe Stefanelli: вы можете захватить ведущую цитату в неиспользуемом поле и конечную цитату в терминаторе для последнего поля. Я протестировал пример, который я опубликовал, и он работает на SQL Server 2008 (который имеет BCP-версию 10.0). – Andomar

+0

+1 Отлично сделано. Я бы не подумал использовать неиспользуемое поле для этой главной цитаты. –

2

Это известная проблема при импорте файлов с текстовыми ограничителями в качестве утилиты BCP/насыпной вставка не позволяет указать разделитель текста. См. this link для хорошего обсуждения.

0

@ anaswer Andomar и получила меня 99% пути там с очень похожей проблемой. Однако я обнаружил, что SQL Server 2014 не смог импортировать последнюю строку, потому что в последнем поле не было новых символов строки: \r\n. Так что мой формат файла был больше похож:

12.0 
4 
1 SQLCHAR 0 50 "\"" 0 unused "" 
2 SQLCHAR 0 50 "\",\"" 1 col1 "" 
3 SQLCHAR 0 50 "\",\"" 2 col2 "" 
4 SQLCHAR 0 50 "\"" 3 col3 "" 

И так для моего файла, который имел ряд с именами полей, импорт SQL стал:

BULK INSERT MyTable 
FROM 'C:\mypath\datafile.csv' 
WITH (
    FIRSTROW = 2, 
    FORMATFILE = 'C:\mypath\formatfile.cfmt', 
    ROWTERMINATOR = '\r\n' 
) 

Действительное CSV было 40 полей, так это было полезно прочитать на Microsoft's website, что нет необходимости писать имена столбцов (col1 - col40 работает просто отлично), а также что четвертый параметр в каждой строке - 50 в этом примере должен быть максимум длина поля, не точный.

Смежные вопросы