Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
ilyam23
Member

Откуда:
Сообщений: 7
Есть CSV-файл с разделителями полей символом запятая ",".
Некоторые поля состоят из текста в кавычках, внутри которого тоже есть запятые. Как при импорте в sql-таблицу не обращать внимания на запятые внутри текста в кавычках?
Например:
Продукт,Валюта,Цена,Комментарий
Рыба,"Включая RUB,USD,EUR; Исключая GBP",350,Заморозка
Мясо,"Включая RUB,EUR,GBP; Исключая USD,CHF",420,"Города - Москва,Питер,Орёл"
3 авг 17, 14:08    [20697892]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20190
Обработать CSV, поменять символ-разделитель.
3 авг 17, 14:24    [20697936]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
aleks222
Guest
Akina
Обработать CSV, поменять символ-разделитель.

Больной?
У тредстартера ИДЕАЛЬНЫЙ CSV.
Все загрузится так.

"текст, текст", - так и полагается экранировать разделитель в CSV.
Вот " в тексте - это действительно проблема.

http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm#FileFormat
3 авг 17, 16:12    [20698489]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
ilyam23
Member

Откуда:
Сообщений: 7
aleks222,
Насколько я понял, лишние запятые, взятые в кавычки в моём csv - это верный формат CSV. И импорт этого файла в таблицу, должен пройти без проблем. Но почему же в моём случае данные из кавычек всё равно разлетаются по следующим колонкам? Возможно нужно как то дополнить мой скрипт?
BULK INSERT RepForSell
FROM 'D:\soft_\sell_report_utf16.csv'
WITH
(
DATAFILETYPE = 'widechar',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
6 авг 17, 08:48    [20703278]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7396
ilyam23,

файл кривой, текстовые литералы должны быть ВСЕ в кавычках:


Продукт,Валюта,Цена,Комментарий
"Рыба","Включая RUB,USD,EUR; Исключая GBP",350,"Заморозка"
6 авг 17, 10:30    [20703332]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20190
aleks222
У тредстартера ИДЕАЛЬНЫЙ CSV.
Формат файла топикстартера - КРИВОЙ. Типичные последствия "работы" малограмотного крохобора.
В корректном CSV либо символ-разделитель в принципе отсутствует в значениях полей, либо абсолютно все значения полей обрамлены символами-ограничителями.
6 авг 17, 23:30    [20704081]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
aleks222
Guest
Akina
aleks222
У тредстартера ИДЕАЛЬНЫЙ CSV.
Формат файла топикстартера - КРИВОЙ. Типичные последствия "работы" малограмотного крохобора.
В корректном CSV либо символ-разделитель в принципе отсутствует в значениях полей, либо абсолютно все значения полей обрамлены символами-ограничителями.


Откуда эти сказки?

A;B;C
техтA;"техтB; техтB";13


у меня замечательно импортируется Excel и Accsess


Тредстартер, нибось, bulk insert пытается задействовать?

К сообщению приложен файл. Размер - 61Kb
7 авг 17, 09:32    [20704376]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
aleks222
Guest
Дык BULK INSERT ничего не ведает про формат CSV.
Нужен CSV - юзай ODBC.
7 авг 17, 09:40    [20704393]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5964
Akina
Формат файла топикстартера - КРИВОЙ. Типичные последствия "работы" малограмотного крохобора.
либо символ-разделитель ... отсутствует в значениях полей, либо абсолютно все значения полей обрамлены

RFC на CSV тоже малограмотные крохоборы писали?
Each field may or may not be enclosed in double quotes
7 авг 17, 09:43    [20704403]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5964
ilyam23,

Как говорит документация
Comma-separated value (CSV) files are not supported by SQL Server bulk-import operations.

И она же говорит, то, что товарищ Akina пытается выдать за особенности формата, хотя это особенности механизма балковой зарузки в MS SQL
CSV-Файлы с разделителями-запятыми не поддерживаются в операциях массового импорта SQL Server. Однако в некоторых случаях CSV-файл можно использовать в качестве файла данных для массового импорта данных в SQL Server. Обратите внимание, что признаком конца поля CSV-файла не обязательно должна быть запятая. CSV-файл, который можно использовать в качестве файла данных для массового импорта, должен соответствовать следующим условиям.
  • Поля данных не должны содержать признак конца поля.
  • Или никакие, или все значения в полях данных должны заключаться в кавычки ("").
  • 7 авг 17, 09:52    [20704432]     Ответить | Цитировать Сообщить модератору
     Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
    Akina
    Member

    Откуда: Зеленоград, Москва, Россия
    Сообщений: 20190
    +
    env
    RFC на CSV тоже малограмотные крохоборы писали?
    Конечно. Как только в спецификации вместо "обязано быть" появляется "может быть" - так сразу и начинаются проблемы. Один реализовал так, другой эдак, а потом удивляются, почему один другого не разумеет...
    7 авг 17, 10:05    [20704470]     Ответить | Цитировать Сообщить модератору
     Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
    ilyam23
    Member

    Откуда:
    Сообщений: 7
    env, Спасибо за подсказку про bulk insert. Буду искать другие пути загрузки.
    7 авг 17, 14:48    [20705524]     Ответить | Цитировать Сообщить модератору
     Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
    982183
    Member

    Откуда: VL
    Сообщений: 3350
    Akina
    В корректном CSV либо символ-разделитель в принципе отсутствует в значениях полей, либо абсолютно все значения полей обрамлены символами-ограничителями.

    В этом есть большой смысл.

    Осталось написать обработчик, который "доведет до ума" исходный файл.
    7 авг 17, 15:25    [20705657]     Ответить | Цитировать Сообщить модератору
     Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
    Akina
    Member

    Откуда: Зеленоград, Москва, Россия
    Сообщений: 20190
    982183, угу... после чего окажется, что в закавыченных полях встречаются квотированные кавычки...
    7 авг 17, 16:10    [20705850]     Ответить | Цитировать Сообщить модератору
     Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
    env
    Member

    Откуда: Россия, Москва
    Сообщений: 5964
    ilyam23,

    openrowset format=csv
    7 авг 17, 16:18    [20705883]     Ответить | Цитировать Сообщить модератору
     Re: Как экранировать символ разделения полей при импорте из csv в таблицу sql?  [new]
    env
    Member

    Откуда: Россия, Москва
    Сообщений: 5964
    ilyam23,

    правда,
    FORMAT = 'CSV'
    Applies to: SQL Server 2017 CTP 1.1.
    7 авг 17, 16:19    [20705887]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить