Сегодня пришло письмо с лицензионными ключами для «CData Enterprise Connectors«. Надо сказать, что с FireDAC я особого знакомства не имел с самого момента его появления в Delphi XE4. Как-то так получилось, что знакомство с этой библиотекой у меня не заладилось с самого начала, так как до того момента я использовал LiteDAC и менять её на что-либо другое не планировал. А сегодня решил немного восполнить пробел, когда увидел список доступных по лицензии компонентов. Тем более, что буквально пару дней назад пришлось поработать с достаточно большим файлом CSV на 14 Мб с кодами ОКТМО из прошлой статьи. А здесь такая возможность — испытать в работе новые компоненты и решить свою локальную задачку по получению из файла CSV необходимых мне кодов.
Что за компоненты «CData Enterprise Connectors»?
На сколько я понимаю, компоненты от CData, так называемые, коннекторы позволяют получить унифицированный доступ к данным из различных приложений и источников данных, используя при этом язык запросов SQL. То есть, используя возможности этих компонентов, я могу работать, например, с файлом CSV как с обычной таблицей базы данных в FireDAC. Звучит вполне себе заманчиво, осталось только разобраться с тем, как это сделать.
Установка компонента CSV/TSV Files
На страничке загрузок выбираем необходимый компонент:
На следующем шаге просят ввести email и лицензионный ключ:
После ввода необходимых данных на компьютер загрузится zip-архив, содержащий установщик setup.exe нашего компонента.
Запускаем его и начинаем установку — вводим снова лицензионный ключ. При установке появится вот такое информационное сообщение:
То есть, лицензионный ключ введен корректный, но подписка не активирована. Жмем в этом окне «Ok» и нас перебрасывает на сайт CData где нам необходимо ввести необходимые данные для активации подписки (имя, адрес, email и т.д.). После того, как вы введете необходимые данные, необходимо снова вернуться в установщик и нажать «Next» и далее установка пройдет без проблем.
Новый компонент TFDPhysCDataCSVDriverLink будет появится на вкладке палитры компонентов «FireDAC Links»:
Теперь можно приступать к работе с CSV файлами с использованием FireDAC.
Приложение VCL для чтения CSV
На входе имеем файл Test.csv в кодировке UTF-8, содержащий информацию по кодам ОКТМО всей Российской Федерации. Скачать файл можно тут. Для начала научимся этот файл читать с использованием FireDAC.
Для работы нам понадобятся следующие компоненты:
- TDBGrid, TDataSource — для показа данных из CSV
- TFDConnection, TFDQuery — для работы с данными в CSV
- TFDPhysCDataCSVDriverLink — для настройки подключения к CSV как к обычной таблице базы данных.
Бросаем эти компоненты на форму приложения:
Настраиваем компоненты следующим образом:
FDConnection1:
- ConnectionName — пишем имя соединения, например «CSV Test»
- DriverName — выбираем из списка значение «CDataCSV»
- Params.DriverID — выбираем из списка значение «CDataCSV»
Остальные свойства можно пока оставить со значениями по умолчанию.
FDQuery1:
- Connection — выбираем «FDConnection1»
- ConnectionName — выбираем из списка значение «CSV Test» (имя нашего соединения)
DataSource1:
- DataSet — выбираем значение «FDQuery1»
DBGrid1:
- DataSource — выбираем значение «DataSource1»
Теперь бросаем рядом с exe-файлом нашего приложения CSV-файл (у нас это Test.csv) и в обработчике OnClick кнопки «Подключиться к CSV» пишем:
FDConnection1.Connected:=True; FDQuery1.SQL.Text:='SELECT * FROM Test'; FDQuery1.Active:=True
Теперь можно запустить приложение и проверить подключение:
Прочитать-то файл мы, конечно, прочитали, но на деле это оказался не такой уж и CSV, что характерно. В этом файле разделителем является не запятая (,), как то ожидается в случае CSV (comma-separated values), а точка с запятой (;). То есть, по факту, у нас оказался не CSV, а DSV (delimiter-separated values). Но это не критично, так как у FireDAC есть возможности обрабатывать и такие файлы тоже. Для этого необходимо немного разобраться со свойствами компонентов FireDAC и возможностями настройки подключений.
Параметры подключения TFDPhysCDataCSVDriverLink
Итак, после того, как мы бросили на форму компонент TFDPhysCDataCSVDriverLink, параметры подключения у TFDConnection изменились и появился целый список свойств (порядка 60 штук). Я перечислю только некоторые из них, которые пригодятся для подключения к локальным файлам CSV/TSV/DSV.
С одним из свойств (DriverID) мы уже ознакомились. Следующее важное для нас свойство — URI. Это свойство определяет путь к файлам CSV/TSV (или, как в нашем случая, к DSV). Так как мы подключаемся к локальным файлам, то в примере выше мы оставили это свойство пустым и программа искала файлы рядом с exe. Программно это свойство можно определить, например, так:
with FDConnection1.Params as TFDPhysCDataCSVConnectionDefParams do URI:=ExtractFilePath(Application.ExeName);
Или так:
with FDConnection1.Params as TFDPhysCDataCSVConnectionDefParams do URI:='c:\Temp';
Далее, в зависимости от того, с каким файлом (CSV или TSV) мы имеем дело, используя свойство FMT мы можем указать одно из значений:
- FMTCsvDelimited — в качестве разделителя в файле используется запятая
- FMTTabDelimited — в качестве разделителя используется табуляция
Свойство HDR в случае выбора его значения как HDRYes определяет, что именами столбцов в таблице будут значения из первой строки файла. В случае, если выбрано значение HDRNo, именами столбцов будут их порядковые номера.
Свойство IncludeFiles содержит список расширений файлов, разделенных запятыми, которые необходимо считать таблицами (по умолчанию файлы .txt, .tab и .csv)
Свойство RowScanDepth позволяет автоматически определять типы данных в столбцах путем сканирования строк таблицы до указанной глубины.
В принципе, этих свойств вполне достаточно, чтобы прочитать локальный файл CSV/TSV с использованием FireDAC максимально удобно для вас. Другой момент — что делать, если у вас окажется файл-DSV.
В этом случае, можно создать свой собственный файл схемы данных (Scheme.ini) и определить в нем необходимые свойства для успешного чтения таблицы.
Создание файла Scheme.ini для чтения CSV (DSV)
Файл Scheme.ini необходимо положить рядом с exe. Сам файл имеет достаточно простую структуру, например, рассмотрим вот файл с вот таким содержимым:
[Test.CSV] Format=Delimited(;) Col1=Ter integer Col2=Kod1 integer Col3=Kod2 integer Col4=Kod3 integer Col5=KC integer Col6=Razdel integer Col7=Name1 varchar Col8=Centrum varchar Col9=NomDescr varchar Col10=NomAkt varchar Col11=Status varchar Col12=DateUtv date Col13=DateVved date
В названии секции указывается имя файла для которого мы определяем схему. Далее, мы указываем формат файла. Format может содержать следующие значения:
- CSVDelimited — канонический CSV в котором в качестве разделителя используются запятые
- TabDelimited — файл TSV
- Delimited(custom character) — DSV для которого в квадратных скобках указывается разделитель.
Мы воспользовались третьи значением и указали в качестве разделителя точку с запятой.
Далее в Scheme.ini можно указать типы данных для каждого столбца в формате:
Coln=Имя_столбца тип данных [Width Ширина столбца]
Нумерация столбцов начинается с единицы.
Подключение к Test.csv с использованием Scheme.ini
Создаем файл Scheme.ini так как показано выше (можно просто скопировать все значения и сохранить рядом с exe-файлом).
Теперь, если запустить приложение, то можно увидеть ровно то, что и ожидалось изначально — все данные из файла будут представлены в виде таблицы:
Теперь мы можем управлять данными в csv также, как и с данными таблица базы данных, например, выбрать только необходимые нам коды:
begin FDConnection1.Connected:=True; FDQuery1.SQL.Text:='SELECT * FROM Test where Ter=52'; FDQuery1.Active:=True end;
Результат:
Также можно вставлять, редактировать и удалять данные из файлов CSV/TSV/DSV. Но об этих операциях поговорим в следующих статьях, так как здесь придется более детально разобраться со схемами данных.
Первое впечатление от «CData Enterprise Connectors«
Несмотря на то, что мне ещё предстоит разобраться более детально с этими компонентами, могу сказать, что первое впечатление от их использования положительное. Да и сама идея унифицировать доступ к разнородным данным достаточно интересная. Конечно, хотелось бы видеть работу с DSV без дополнительных движений в сторону Schema.ini, но и так сойдет :)
по возможности, размещайте файлы на mega. Яндекс у нас заблочен