Импорт CSV в SQL Server 2008 - PullRequest
3 голосов
/ 20 августа 2010

У меня есть CSV-файл, в котором значения столбцов заключены в двойные кавычки.

Я хочу импортировать CSV-файл из сетевого пути с помощью оператора SQL.

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

Спасибо -Vivek

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

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

"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
2 голосов
/ 20 августа 2010

Это известная проблема при импорте файлов с разделителями текста, поскольку утилиты вставки bcp / bulk не позволяют указывать разделитель текста. См. эту ссылку для хорошего обсуждения.

0 голосов
/ 13 декабря 2014

@ Отвечая на вопрос Андомара, я получил 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 , что нет необходимости писать имена столбцов (col1 - col40 работает просто отлично), а также что четвертый параметр в каждой строке - 50 в примере, просто должен быть максимальный длина поля, а не точный.

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