powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чтение из .CSV. Не найти простую команду.
22 сообщений из 22, страница 1 из 1
Чтение из .CSV. Не найти простую команду.
    #40072964
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, добрый день!

Всевышний столкнул меня с вопросом чтения данных из CSV-файла с использованием "Micrisoft Text Driver". Само прямое чтение налажено. Но в процессе чтения необходимо сделать простую замену некоторых символов в полученных строках. В частности, символ 'S' следует заменить на '91'.
Я с совершенно умным видом стал применять REPLACE. Оказалось, что драйвер не знает такой команды.
Я стал применять LEN, тоже неизвестная команда для драйвера.

Какие-то операторы он понимает, например LEFT... Но достаточный набор команд мне не удалось отыскать.
Попытался потыкаться, решения так и не нашел.

Прошу помощи!
Как узнать, какие есть доступные команды-аналоги у этого драйвера и есть ли они вообще?

Спасибо заранее!
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072965
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441,

Можно залить файл в staging-таблицу как есть, а потом уже делать преобразования нормальным SQL. На выходе будет отдельная таблица с корректными данными.

Если файл большой и льется долго, то я бы сделал заливку через SSIS, в котором обработка делается промежуточным Script Transformation. Там уже на C# можно эти строки как угодно гнуть, и без промежуточной стадии сразу заливать в базу конечный результат.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072967
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael,

Спасибо за вариант!
Уточните, пож-та, если в моем случае нет на сервере никакой БД, чтобы там обустроить это временное хранилище, то как и чем проще и лучше выполнить это первичное чтение? Уж явно не этим туповатым драйвером?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072975
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Ennor Tiegael,

Спасибо за вариант!
Уточните, пож-та, если в моем случае нет на сервере никакой БД, чтобы там обустроить это временное хранилище, то как и чем проще и лучше выполнить это первичное чтение? Уж явно не этим туповатым драйвером?
А куда вы этот CSV читаете, в таком случае - в dev/null, что ли?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072978
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael,

У меня задача немного специфическая.
Я читаю информацию в специализированное приложение. Это приложение умеет коннектиться по ODBC к БД посредством SQL-запросов. Мне выпало настроить чтение из CVS в это приложение. Посоветовали использовать стандартный драйвер "Micrisoft Text Driver". Получается, без третьей сущности, которая прочитает CSV и положит в staging-таблицу не обойтись?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072979
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
В частности, символ 'S' следует заменить на '91'

Раз есть файл, так замени в исходном файле.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072989
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Begimot441
В частности, символ 'S' следует заменить на '91'

Раз есть файл, так замени в исходном файле.
Кстати да, самый простой вариант наверное. Разве что разделители могут начать путаться под ногами.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40072996
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Спасибо, но этот вариант не подходит.
Файлы периодически обновляются. Таким примитивным образом организован информационный обмен данными между системами.
Т.е., моя система-приемник периодически читает данные из конкретного файла в конкретной папке.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073030
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441,

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

Даже целая подотрасль образовалась, ETL. Именно для этого. И там постоянно подготовка и очищение данных.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073043
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441,

используй JET/ACE провайдер
REPLACE-а они, правда, тоже "не знают", но про все остальные строковые функции (len, instr, mid, left, right) - "в курсе"
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073051
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кесарь,

А можно уточнить, как (в каком виде) проще сделать техническую таблицу? Необходимо отдельную БД разворачивать или можно проще (как то в винде)?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073053
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Можно ссылку на этого зверя (сходу не получились найти)?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073054
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Т.е., моя система-приемник периодически читает данные из конкретного файла в конкретной папке.

Ну так сделай замену, когда вычитываешь, в чём проблема? Ты не можешь работать непосредственно с файловым стримом?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073055
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
court,

Можно ссылку на этого зверя (сходу не получились найти)?


https://www.connectionstrings.com/textfile/
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073067
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Кесарь,

А можно уточнить, как (в каком виде) проще сделать техническую таблицу? Необходимо отдельную БД разворачивать или можно проще (как то в винде)?


В максимально повторяющем вид исходных данных. Как минимум эта таблица должна иметь тоже кол-во столбцов, что и файл.

Для всякого мусора как правило используются поля типа varchar(8000). Но это конечно зависит от данных и от того, понимает ли ваш драйвер, что конкретная колонка например содержит целочисленные данные (для CSV всё надо лить как строковые, конечно).

И вот когда залили вы эти данные, то начинайте их преобразовывать и перезаливать во вторую техническую таблицу, которая будет содержать уже подготовленные данные. Такое-то поле в такой-то тип данных, другое поле в другой тип данных и т.п. по всем полям. Можно создать индексы.

Затем уже начинайте анализировать и разбирать эти данные.

Тут уж общих рецептов нет. Всё зависит от конечного назначения это инфы. Если у вас она должна породить некий рабочий цикл с созданием новых сущностей, запуском процедур, раздачей прав допуска на новые объекты и т.п., то тут уж разбор строго построчный при помощи курсора.

Если же нужно просто разложить по связанным таблицам, то тут уже обычными запросами.


P.S. "Разворачивать БД" - это слишком сильно сказано. Создайте на том же сервере БД Garbage и пишите туда всё, что хотите.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073099
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"У меня задача немного специфическая.
Я читаю информацию в специализированное приложение. Это приложение умеет коннектиться по ODBC к БД посредством SQL-запросов. Мне выпало настроить чтение из CVS в это приложение."


1.Обмен данными между различными системами с помощью CVS вполне нормально.

2.Зачем куда-то коннектиться, если нужно читать файл в приложение? CVS – это самый обычный текстовый файл. В приложении, если вы его контролируете, открыли этот файл, прочитали из него строку стандартными механизмами и делайте с этой строкой все, что вам хочется. Зачем использовать для этого посредники: "туповатый драйвер" и соединение ODBC?

3.Ваш CVS можно, как вариант, прочитать из БД так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select  c1
         , case when charindex(N' / ', c1, 1)>1 then substring(c1, 1, charindex(N' / ', c1, 1)-1)    else c1 end
         , case when charindex(N' / ', c1, 1)>1 then substring(c1, charindex(N' / ', c1, 1)+3, 1000) else '' end
     from openrowset(bulk       'fullPathCSV\fileNameCSV.csv' 
                    ,formatfile='fullPathXML\fileNameXML.xml'
                    ,firstrow  =2
                   ) as x
    where c1 like N'Р%';



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Файл описания CVS-файла выглядит примерно так:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
	<FIELD ID=" 1" xsi:type="CharTerm" TERMINATOR=";" />
    ...
	<FIELD ID=" 6" xsi:type="CharTerm" TERMINATOR="\n" />
</RECORD>
<ROW>
	<COLUMN SOURCE=" 1" NAME="c1"     xsi:type="SQLNVARCHAR" LENGTH="30"  />
    ... 
	<COLUMN SOURCE=" 6" NAME="c6"     xsi:type="SQLNVARCHAR" LENGTH="10"  />
</ROW>
</BCPFORMAT>



Посмотрели на результат, если преобразования выполняются правильно, то, я надеюсь, вы справитесь с дальнейшими действиями.
В этом случае я даже не знаю, какой драйвер используется.

Да простит меня alex222, если я сморозил глупость.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073102
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

спсб! Век живи, век учись. Оказывается CSV тоже можно задавать формат. Ну да, если подумать, то это логично.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073121
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wlr-l,

Спасибо!

1. Буду иметь в виду.

2. К сожалению, это приложение я не контролирую. Я имею его в пользовании, но дописать такую элементарную вещь как "прочитали из него строку стандартными механизмами и ... " сделать не могу((

3. Поясните, пож-та, что делает этот запрос? Для чего "файл описания"?

Заранее спасибо!
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073133
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Begimot441,

В документации MS SQL Server есть раздел, посвященный openrowset. Там много чего интересного можно найти, особенно с сочетании со словом bulk. Лучше и проще, чем там написано, я рассказать не смогу.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073137
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wlr-l,

Понял, согласен, обязательно изучу.

Последний вопрос. Верно ли я понимаю, что конструкция, которая представлена Вами позволит мне читать данные именно посредством указанного драйвера (который я обозвал "туповатым")?
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073145
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Begimot441,

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

Да, забыл сказать, что я привел пример, взяв кусочек из своего запроса.
...
Рейтинг: 0 / 0
Чтение из .CSV. Не найти простую команду.
    #40073150
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья,

Спасибо за помощь!
Простого решения, к сожалению, я не нашел.
Но узнал, что к чему.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чтение из .CSV. Не найти простую команду.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]