Возникла у меня на днях задача организовать прямой доступ к выпискам Сбербанка РФ, уже загруженным в клиент банк. Казалось бы ничего сложного, ADO, нужный OLE DB провайдер и вперед. Однако неисповедимы пути монополиста. Все данные лежат в таинственном ".ddf" формате, про который известно лишь то, что это разработка самого сбербанка, жутко секретная, шифрующая данные на лету итд итп. На просторах интернетов однако удалось найти упоминание утилиты "convert.exe" которая умудряется данные эти извлекать, помещать в "dbase" или текст. В свободном доступе утилиты почему то не оказалось, специалисты банка предоставить её так же отказались, казалось бы почему? Это же мои данные! У меня и ключи все есть, дайте их прочитать. В мире не без добрых людей, я таки получил этот "программный продукт".
Утилита оказалась под ДОС. Она не умела работать с длинными именами файлов с пробелами, она не умела создавать "dbase" файл, а требовала, чтоб ей предоставили пустой с подготовленной структурой, соответствующий формату файла шаблона, который тоже необходимо было подготовить предварительно ручками.
Для её удобоваримого использования была придумана следующая схема:
- В планировщике по расписанию работает скрипт, который генерит "dbase" файл из ".ddf" файла
- Целевой софт (в моем случае это была БП 2.0) открывает этот "dbase" файл и обрабатывает как его душе угодно
Второй пункт интереса не представляет, поэтому расскажу о подводных камнях по первому пункту.
- Данная утилита не будет работать на x64 операционной системе. Там больше нет виртуальной дос машины.
- Данная утилита не воспринимает файлы шаблона с "неправильным" расширением.
- Данная утилита не сможет работать с длинными именами файлов с пробелами, никаких Documents and settings
Скрипт реализован на Powershell. В заголовке файла Convert.ps1 необходимо указать пути до ваших данных.
Идея следующая:
- Networkdir -это папка, где лежат: файл данных, шаблон конвертации ddf-dbf, пустой dbf файл.
- Tempdir -это папка, где будут находиться временные файлы, создаваемые для работы утилиты конвертации.Не разрешены длинные имена, пробелы, сетевые пути.
- vibor.ddf - файл данных клиента сбербанка, содержащий информацию о выписках
- sbrf.obd - файл шаблона конвертации. В нем описывается откуда, куда и какие поля необходимо грузить
- emptybank.dbf - пустой файл формата dbase III c заранее подготовленной под правила конвертации структурой
Так как скрипт работает параллельно целевой информационной системе, и генерирует случайные имена файлов каждый раз при запуске, прибираться за собой во временном каталоге - его работа. При старте он удаляет все "dbf" файлы, кроме шаблона. После этого генерируются имена временных файлов, в которые будут помещены локальные копии необходимых файлов (ДОС программа не сможет работать по сети и с длинными именами). После генерации имен файлов необходимо отредактировать шаблон выгрузки, так как в нем указывается файл источник и файл приемник. Тут возникает неожиданная проблема: хотя файлы уже созданы - утилита их не видит. Помогла вставка задержки. ДОС программы вызываются асинхронно, скрипт не ждет, пока выполнится программа. Поэтому приходится ставить ещё одну задержку после вызова программы. После создания "dbf" файла он копируется в общую папку для целевой программы. После исполнения скрипта программа подчищает за собой все временные файлы из папки временных файлов.
Отдельное спасибо Bill Stewart за его утилиту по замене строки в файлах.