Как сделать из xml dbf

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Столкнулись мы как-то с необходимостью ввода корректной информации о местонахождении (прописке, регистрации) пользователей, и с тем, что проблема эта решается не совсем так легко и просто, как бы нам хотелось. Сначала мы попробовали КЛАДР, в его бесплатной ипостаси. Не то чтобы нам прямо-таки решительно все не понравилось, но было как минимум одно весьма раздражающее обстоятельство — некоторые адреса отсутствовали в справочнике. Например, дом 10 есть, а 10к1 — извините, не завезли. Вообще КЛАДР был привлекателен тем, что у него есть простой API и плагины (jQuery в частности), которые можно легко встроить в приложение, но отталкивал наполнением. Мы задумались — если нет такого ресурса, содержащего полную и наиболее актуальную адресную информацию, с API и плагинами, то единственный выход — создать такой ресурс самим.

Часть 2. Искательская. “Где собака зарыта?!”

И прослышали мы про ФИАС. О том как он бесконечно полон и прекрасен. А это выход! На сайте ФИАС есть базы, и все что нужно молодой растущей информационной системе! Правда, размер базы составляет более 4 Gb, ну да ладно, это же вся Россия! Обновляется база регулярно, так что есть где разгуляться. Дело за малым — развернуть базу, прикрутить API и плагины. Надо оговориться, что существует несколько релевантных и важных статей. К примеру, цикл вот этих статей, которые изначально очень помогли.

Проблемы начались с того, что база данных ФИАС поставляется в формате .dbf, данные из которого надо было как-то перенести в PostgreSQL, который было решено использовать в качестве БД.

    Информация про обновления: по официальным данным — выходят не менее раза в неделю. Специфика следующая. Иногда выходят битые обновления. Их размер примерно 1,2 Mb и при скачивании дается битый архив, поэтому торопиться настраиваться только на последнее обновление — вызывает вопросы.

Так какую же все таки выбрать версию для скачивания .xml или .dbf? Отличия следующие:

    xml — каждый файл в архиве — отдельная таблица. В чем состоит проблема. К примеру, размер файла “HOUSEXX” где хранятся дома, составляет более 20 Gb в разархивированном виде. Как его парсить? С одной стороны, если у вас более 30 Gb RAM, то это не составит проблемы. Также, если вы знаток грамотных библиотек, таких как SAX Parser для Java, которые не загружают файл целиком в память, а парсят частями, то может быть что-то и получится.

  • ADDROBХХ.DBF, где ХХ — номер региона — содержит данные непосредственно о регионе, автономных округах, городах и прочих населенных пунктах, улицах.
  • HOUSEХХ.DBF, где ХХ — номер региона — содержит информацию о номерах домов.
  • NORDOCХХ.DBF, где ХХ — номер региона — содержит информацию о причинах изменений в различных записях.
  • ROOMХХ.DBF, где ХХ — номер региона — содержит информацию о помещениях.
  • STEADХХ.DBF, где ХХ — номер региона — содержит информацию о земельных участках.
  • SOCRBASE.DBF — содержит информацию о сокращениях.
  • STRSTAT.DBF — содержит информацию о типе строения.

В большинстве случаев достаточно сформировать адрес вплоть до дома. Хотя, если кому надо, то можно углубиться и дальше.

Таким образом, создадим 2 таблицы в БД postgresql.

Таблица с адресами:


Таблица с номерами домов:


Импорт данных осуществляется простым способом. Открываем файлы в Excel и сохраняем их как csv. Дополнительно рекомендуется изменить кодировку, так как в отличии от xml файлов, которые представлены в кодировке utf-8, dbf файлы — в кодировке win-866. Открываем файлы в редакторе (для данной цели подойдет notepad++) и преобразуем в utf-8.

Импорт таблицы с адресами:


Импорт таблицы с домами:


Из чего сделана таблица ADDROBXX?

Несмотря на обилие полей, понадобятся только некоторые из них.

  • ACTSTATUS — поле содержит значения 0 и 1. При внимательном просмотре обнаружится, что в таблице множество улиц с одним и тем же названием. Дело в том, что налоговая база содержит историю объектов, т.е. изменения, которые происходили с каким-либо элементов адреса. К примеру, улиц Ленина может быть 10 штук. Из них 9 — будут неактуальными. Они могли быть переименованы или изменены другим образом. ACTSTATUS — 0 — неактуальные адреса, а 1 — будет единственным актуальным.
  • AOGUID — ID записи. Для разных исторических записей будет один и тот же AOGUID. Различаться они будут по полю AOID.
  • AOLEVEL — уровень объекта. Под номером 1 — субъект федерации, 4 — город, 7 — улица и т.д.
  • CENTSTATUS — статус центра. Например, города в областном центре.
  • FORMALNAME — название объекта.
  • PARENTGUID — ID родительского элемента. При поиске города к которому принадлежит улица. PARENTGUID улицы будет совпадать с AOGUID улицы.
  • POSTALCODE — почтовый индекс.
  • REGIONCODE — код субъекта федерации.

Важное в таблице HOUSEXX:

  • AOGUID — ID улицы в ADDROBXX, в которой находится дом.
  • HOUSEGUID — ID дома.
  • Сложность заключается в наименовании дома. Оно состоит из 4 полей:
  • BUILDNUM — номер корпуса.
  • HOUSENUM — номер дома.
  • STRUCNUM — номер строения.
  • STRSTATUS — признак строения (от 0 до 4, где 0 — никакого, 1 — строение, 2 — сооружение, 3 — литера).

Далее, после того, как база была импортирована в Postgres — мы занялись созданием API и плагина для нашей системы.

Для API, дабы не изгаляться, использовали Laravel. Схема запросов получилась достаточно простой. Иерархия объектов выглядит следующим образом:

  • Субъект федерации
  • Регион субъекта федерации
  • Населенный пункт
  • Улица
  • Дом

Схема запросов выглядит просто:

    — список субъектов федерации — список районов субъекта федерации — список населенных пунктов региона — список улиц населенного пункта — список домов улицы населенного пункта

Регион и район можно убрать за ненадобностью, так как они подтягиваются вместе с городами.
При вводе высплывают autocomplete-подсказки, как и в КЛАДР. Правда разница заключается в том что КЛАДР-плагин предназначен для автодополнения, а здесь валидным считается только адрес, выбранный из подсказок.

В папке ASPUDcomponent — находится VueJs компонент для работы с адресной базой.
Исходники доступны в нашем репозитории.

Часть 4. Как это все обновлять?

С обновлениями ситуация следующая: для начала необходимо по протоколу SOAP получить версии обновлений. Посмотреть как это делается можно в классе UpdateController (метод: filesVersions()).

Примечание: версия, которая указана последней в полученном списке — не обязательно совпадает с той, которую можно скачать на главной странице. Но не стоит спешить скачивать только последнюю версию, так как она может оказаться “битой”. Случались и таким прецеденты. Далее скачивается архив с последней версией и распаковывается. Для работы необходимо использование расширения для php (php_rar.dll).

Ну а далее выбирается необходимый файл региона (или при необходимости все файлы) для обновления БД.

Сохранение формата DBF в Microsoft Excel

DBF – это популярный формат хранения и обмена данными между различными программами, а в первую очередь, между приложениями, которые обслуживают базы данных и электронные таблицы. Хотя он и стал устаревать, но продолжает оставаться востребованным в различных сферах. Например, с ним продолжают активно работать бухгалтерские программы, а контролирующие и государственные органы принимают значительную часть отчетов в данном формате.

Но, к сожалению, Эксель, начиная с версии Excel 2007, прекратил полноценную поддержку указанного формата. Теперь в этой программе можно только просмотреть содержимое DBF-файла, а сохранить данные с указанным расширением встроенными инструментами приложения уже не получится. К счастью, имеются другие возможности конвертации данных из программы Excel в нужный нам формат. Рассмотрим, каким образом это можно выполнить.

Сохранение данных в формате DBF

Но, к сожалению, начиная с версии Excel 2007, разработчики Microsoft посчитали dBase устаревающим, а современные форматы Эксель слишком сложными для того, чтобы тратить время и средства на обеспечение полной совместимости. Поэтому в Excel осталась возможность читать DBF-файлы, но поддержка сохранения данных в этом формате встроенными программными инструментами была прекращена. Тем не менее, существуют некоторые способы конвертации данных сохраненных в Excel в DBF при помощи применения надстроек и другого программного обеспечения.

Способ 1: программа WhiteTown Converters Pack

Существует ряд программ, которые позволяют конвертировать данные из Excel в DBF. Один из самых простых способов конвертирования данных из Excel в DBF является использование пакета утилит для конвертирования объектов с различным расширением WhiteTown Converters Pack.

Хотя процедура установки данной программы проста и интуитивно понятна, все-таки подробно остановимся на ней, указав на некоторые нюансы.

Выбор языка установки WhiteTown Converters Pack

Выбор папки установки WhiteTown Converters Pack

Выбор компонентов при установке WhiteTown Converters Pack

Выбор ярлыка WhiteTown Converters Pack

Создание значка на рабочем столе программы WhiteTown Converters Pack

Переход к установке программы WhiteTown Converters Pack

Процедура установки программы WhiteTown Converters Pack

Завершение установки программы WhiteTown Converters Pack

Запуск утилиты XLS to DBF Converter

Переход к добавлению файла в XLS to DBF Converter

Открытие файла в XLS to DBF Converter

переход в следующую вкладку в XLS to DBF Converter

Переход к выбору папки для сохранения файла в XLS to DBF Converter

Первый вариант указания директории сохранения файла в XLS to DBF Converter

Второй вариант указания директории сохранения файла в XLS to DBF Converter

Переход в третию вкладку вкладку в XLS to DBF Converter

  • dBASE III;
  • FoxPro;
  • dBASE IV;
  • Visual FoxPro;
  • >SMT;
  • dBASE Level 7.

Выбор типа файла DBF в XLS to DBF Converter

Переход к процедуре конвертации в XLS to DBF Converter

Завершение конвертации в XLS to DBF Converter

Единственный существенный недостаток способа с применением пакета утилит WhiteTown Converters Pack состоит в том, что бесплатно можно будет провести только 30 процедур конвертирования, а потом придется приобретать лицензию.

Способ 2: надстройка XlsToDBF

Конвертировать книгу Эксель в dBase непосредственно через интерфейс приложения можно с помощью установки сторонних надстроек. Одной из лучших и наиболее удобных из них является надстройка XlsToDBF. Рассмотрим алгоритм её применения.

    После того, как скачали архив XlsToDBF.7z с надстройкой, распаковываем из него объект под названием XlsToDBF.xla. Так как архив имеет расширение 7z, то распаковку можно проводить либо стандартной программой для этого расширения 7-Zip, либо с помощью любого другого архиватора, который поддерживает работу с ним.

Распаковка архива 7Z в программе 7-Zip

Переход в Параметры в Microsoft Excel

Переход в надстройки в Microsoft Excel

Окно надстроек в Microsoft Excel

Открытие надстройки в Microsoft Excel

Установка надстрйки в Microsoft Excel

Таблица Excel открыта в Microsoft Excel

Наименование файла DBF в Microsoft Excel

Кодировка файла DBF в Microsoft Excel

  • N (Numeric) – числовой;
  • L (Logical) – логический;
  • D (Date) – дата;
  • C (Character) – строковый.

Кроме того, в строковом (Cnnn) и числовом типе (Nnn) после наименования в виде буквы следует указывать максимальное количество символов в поле. Если в числовом типе применяются десятичные знаки, то их количество тоже нужно указать после точки (Nnn.n).

Существуют и другие типы данных в формате dBase (Memo, General и т.д.), но данная надстройка с ними работать не умеет. Впрочем, с ними не умел работать и Excel 2003, когда ещё поддерживал конвертацию в DBF.

Типы полей DBF в Microsoft Excel

Переименования полей в Microsoft Excel

Переход к макросам в Microsoft Excel

Запуск макроса в Microsoft Excel

Как видим, данный способ значительно сложнее предыдущего. Кроме того, он весьма ограничен по количеству используемых типов полей и создаваемых типов объектов с расширением DBF. Ещё одним недостатком является то, что директорию создания объекта dBase можно назначать только перед процедурой конвертирования, путем прямого перемещения в папку назначения исходного Excel-файла. Среди преимуществ данного способа можно отметить то, что в отличие от предыдущего варианта, он абсолютно бесплатен и практически все манипуляции производятся непосредственно через интерфейс Эксель.

Способ 3: программа Microsoft Access

Хотя у новых версий Excel и нет встроенного способа сохранение данных в формате DBF, но, тем не менее, вариант с применением приложения Microsoft Access более всего приблизился к тому, чтобы назвать его стандартным. Дело в том, что эта программа выпущена тем же производителем, что и Эксель, и также входит в пакет Microsoft Office. К тому же, это самый безопасный вариант, так как не нужно будет связываться с программным обеспечением сторонних производителей. Microsoft Access специально предназначен для работы с базами данных.

    После того, как все необходимые данные на листе в Эксель введены, для того, чтобы конвертировать их в формат DBF, нужно сначала произвести сохранение в одном из форматов Excel. Для этого кликаем по иконке в виде дискеты в левом верхнем углу окна программы.

Переход к сохранению файла в Microsoft Excel

Сохранение файла в Microsoft Excel

Переход к открытию файла в Microsoft Access

Открытие файла в Microsoft Access

Окно связи с электронной таблицей в Microsoft Access

Второе окно связи с электронной таблицей в Microsoft Excel

Третье окно связи с электронной таблицей в Microsoft Excel

Наименование таблицы в Microsoft Access

Перемещание во вкладку Внешние данные в Microsoft Access

Переход к экспорту данных в Microsoft Access

Нужно учесть, что чем современнее формат (выше порядковый номер), то тем больше существует возможностей по обработке в нем данных. То есть, выше вероятность того, что в файле удастся сохранить все данные таблицы. Но в то же время ниже вероятность того, что программа, куда вы в будущем собираетесь импортировать файл DBF, будет совместима именно с этим типом.

Окно экспорта в формат DBF в Microsoft Access

Окно экспорта в формат DBF в Microsoft Access

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

Как видим, несмотря на то, что в современных версиях Excel отсутствует возможность сохранения файлов в формате DBF встроенными инструментами, тем не менее, данную процедуру можно осуществить с помощью применения других программ и надстроек. При этом следует отметить, что наиболее функциональный способ конвертирования – это использование набора утилит WhiteTown Converters Pack. Но, к сожалению, количество бесплатных преобразований в нем ограничено. Надстройка XlsToDBF позволяет выполнить конвертацию абсолютно бесплатно, но процедура намного сложнее. К тому же функционал данного варианта очень ограничен.

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

В основе работы с XML-файлами лежит технология доступа SAX, которая осуществляет считывание по одному тегу. Для этого существует два типа данных – ЗаписьXML и ЧтениеXML.
Запись данных справочника в XML-файл:
Код 1C v 8.х

Чтение данных из XML-файла в справочник:
Код 1C v 8.х
Создадим обработку в типовой конфигурации для экспорта плана счетов. Структура xml-файла должна быть такой. Корневой элемент xml-документа соответствует плану счетов в целом. В нем располагаются подчиненные элементы с именем Счет, содержащие информацию о счетах. В качестве содержимого элементов указывается наименование счета. Остальные данные записываются в качестве атрибутов (код, признаки валютного, количественного учета и пр.). В качестве подчиненных элементов для элемента Счет задаются элементы, обозначающие его субсчета с теми же атрибутами. Приведем код процедуры экспорта плана счетов.
Код 1C v 7.x
В результате будет получен файл, вот его фрагмент:
Код

А теперь приведем код для импорта плана счетов из xml-файла в новую конфигурацию. Код модуля соответствующей обработки должен содержать процедуру Выполнить(), которая имеет такой вид.

Распечатать

Похожие FAQ

Еще в этой же категории

Вопрос действительно интересный! :-) Схема получения dbf-таблиц могла бы быть следующей:

  1. получение xml- данных из xls- файла
  2. преобразование полученных xml- данных в структуру, пригодную для преобразований в связанные dbf- файлы
  3. ну и собственно преобразование xml- данных в dbf -таблицы, используя VFP- класс XMLAdapter

Первый шаг может быть выполнен достаточно просто, если вы имеет Excel из MS Office 2003 (или выше). Чтобы выполнить второй шаг, на мой взгляд, проще всего воспользоваться технологией XSLT -преобразований, для чего следует хотя бы в общих чертах иметь представление об этой технологии. Другие пути для выполнения преобразований над xml -данными в использовании xml -парсеров и объектной модели DOM , также возможно написание кода обработки с использованием SAX2 . Если у вас большие объёмы данных, то последнее выглядит наиболее предпочтительным. Наконец, чтобы воспользоваться VFP- классом XMLAdapter , появившемся в версии 8.0 , вы должны быть обладателем именно версии VFP 9 .0 (или выше), т.к. в перелагаемом в этой статье VFP- коде, используется свойство XMLField.XMLNameIsXPath . Ниже предполагается, что все перечисленные условия удовлетворены.

Итак, попробуем пройти все шаги, разбирая конкретный пример данных в MS Excel 2003. Допустим, что требуется получить dbf- таблицы для данных, которые в MS Excel выглядят так:


Представленная таблица имеет "заголовок таблицы" (строки: 3-6), со строк: 7, 15, . начинаются группы, а со строк: 8,13;16. начинаются соответствующие подгруппы. Каждая подгруппа помимо своего "заголовка" (строки: 8, 13, 16, . ), имеет некоторое множество строк - "содержания подгруппы" (строки: 9-12,14,17-20, . ).

По этим данным, требуется получить три VFP- таблицы связанные отношениями:

  • для заголовков групп (назовём её group ),
  • для заголовков подгрупп (назовём её subgroup )
  • и наконец, для данных подгрупп (назовём её cells )

Экспорт данных Excel- таблицы в xml- файл

Как было сказано выше, для этого средствами MS Excel 2003 (или выше), выделив соответствующую таблицу ( из файла: table.xls) , выполним пункт меню: Файл/Сохранить как. [ Другие форматы/Тип файла: Таблица XML 2003 ] .


при этом, на возникший запрос о несоответствии формата следует ответить утвердительно. После чего мы получим файл с данными таблицы в xml- формате примерно такой структуры:

здесь незначимая для нас информация упущена и оставлено только то, что нам необходимо для дальнейшей работы. Обратите внимание на следующие моменты:

  • корневой элемент имеет "область имён" ( namespace ) "по умолчанию": xmlns="urn:schemas-microsoft-com:office:spreadsheet" .
  • собственно "сами данные" располагаются в элементах: /.//Workbook/Worksheet/Table/Row , а точнее в /.//Workbook/Worksheet/Table/Row/Cell/Data , в то время как значение атрибута ss:StyleID="s. " у элемента Cell позволяет достаточно чётко различать функциональную особенность данных элемента.

Удаление "области имён по умолчанию"

К сожалению, наличие "области имён по умолчанию" делает невозможным использование таких средств как XSLT -преобразования. Поэтому первым шагом на нашем пути, удалим xmlns="urn:schemas-microsoft-com:office:spreadsheet" из корневого элемента Workbook , а полученный после такого редактирования файл сохраним с новым именем (из _table.xml в table.xml в нашем случае).

Признаки отбора "прикладных данных"

Относительно "признаков выбора", требуемых нам "прикладных данных", глядя на содержимое полученного xml- файла, можно заметить следующее:

  • информация "о группах" располагается в таких элементах /.//Workbook/Worksheet/Table/Row/Cell/Data , у которых для элемента Cell атрибут ss:StyleID="s43"
  • в свою очередь, признаком выбора информации "о подгруппах" является значение этого атрибута ss:StyleID="s44"
  • наконец, элемент Row тогда содержит множество ячеек Cell содержащих "данные подгруппы", если среди них есть элемент Cell с атрибутом ss:StyleID="s42"

Далее, мы постараемся воспользоваться этими обстоятельствами, чтобы организовать обработку данных с помощью XSLT- преобразования.

XSLT- преобразование из "плоского" XML в "структурированный", согласно группировки данных

Если вы уже имели опыт написания XSLT- преобразований, вам наверное известно, что всякий раз, когда требуется решить задачу, связанную "с организацией группировок в XSLT ", мы испытываем вполне ощутимые трудности. :-( см. например, одно из решений здесь: http://xmlhack.ru/books/xslt/ch_11.html. В нашем случае, "на входе" мы имеем "линейную" последовательность элементов Row , тогда как "на выходе" т.е. в результате преобразований, нам требуется получить "вложенные" xml- структуры согласно связям типа: "родитель - > дети".

Чтобы обеспечить это, воспользуемся перебором всего множества элементов из /.//Workbook/Worksheet/Table/Row с помощью XSLT -конструкции: , организуя требуемую вложенность элементов их "динамическим формированием" в выходной поток. Что же конкретно нам нужно? Попробуем сформулировать:

  • всякий раз, когда "на входе" встречается элемент Row , содержащий в себе элемент Cell с атрибутом ss:StyleID="s43", нам нужно "организовать начало новой группы" (закрыв прежде открытую, если такая имеется, естественно). В качестве имени для такого группового элемент возьмём название group.
  • в рамках групп, организованных с помощью предыдущего пункта, при обнаружении "на входе" в текущем Row элемента Cell с атрибутом ss:StyleID="s44", нам следует организовать начало новой вложенной подгруппу (закрыв аналогичную предшествующую, если такая имеется). В качестве имени элемента для подгруппы возьмём subgroup.
  • по завершению цикла обработки всего множества элементов Row мы должны закрыть как подгруппу subgroup так и группу group , если они не были ещё закрыты.

Здесь предполагается, что во входном потоке отсутствуют "разрывы" в смысле групп/подгрупп. Т.е. данные во входном потоке упорядочены в строгом соответствии с требованиями группировок, а также и то, что во входном потоке нет данных, не принадлежащих ни группам, ни их подгруппам. Основная трудность в реализации этой схемы заключается в проверке условий на момент открытия новой группы/подгруппы, позволяющих ответить на вопрос: а есть ли ранее открытые аналогичные группы/подгруппы, которые следует закрыть при открытии новых?

Конвертация xml файла в dbf

Маленькая обработка, с помощью которой можно быстро конвертировать XML-файл в DBF-файл. При формировании полей дбф-файла учитывает вложенные элементы.

  • konverterxmltodbf.epf (10Kb)
  • Конвертация xml-dbf
  • дата загрузки: 31.01.2013 14:08:06


Интеграция 1С 8 "Управление торговлей" и VirtueMert


Как из 1С правильно УКАЗАТЬ MS EXCEL как нужно печатать документы !


Выгрузка прайса в Excel из 1с7 ТиС.

Найти хорошего 1С программиста для сопровождения и внедрения 1С-программ довольно сложно - нужно оценить ваш уровень ведения учета и четко сформулировать для себя конкретные требования к работе программиста 1С.

"Рассмотрим как перенести номенклатуру в единый справочник номенклатуры с помощью Конвертации данных"

Читайте также: