rss
Навигация
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-payrss
Последние записи
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет
Каменты [еще]
2017-05-17 11:25:31 [articles] Владимир:
2016-12-20 17:49:41 [articles] Виталик:
2016-12-01 23:34:25 [news] Meteor:
2016-11-11 03:35:47 [articles] Tata10:
2016-07-27 14:28:19 [articles] Сергей:
2016-05-17 09:56:26 [articles] юра:
2016-04-29 18:03:48 [articles] agatsky.dn:
Теги
Друзья
Блог малова Лучшие стихи зая =) Мед в Красноярске Daniil V. Savenkoff Blog | То, что мне когда-то пригодилось... Велкам в друзья!

Парсинг баз ФИАС в MySQL (потоковый XML парсер)

Сентября
2012 года
26
Теги: программинг,
Раздел: zgbox.ru -> Статьи -> Софт -> Парсинг баз ФИАС в MySQL (потоковый XML парсер)
Просмотров: 12712
В этой статье я опишу свой метод и программу парсинга базы данных ФИАС (Федеральная Информационно Адресная Система).

Началось все с того, что для разработки одного проекта потребовалась адресная база. Было принято решение использовать базу ФИАС. Поскольку базу нужно было загнать в MySQL встал вопрос ее парсинга. Попробовал фиасовский DBF, поискав потоковые парсеры - я так и не нашел удовлетворения, и как это часто бывает, решил написать свою программу, так родился этот потоковый парсер ФИАС. (сслыка на скачивание в конце статьи)

скриншот программы:
image

Программа конвертирует базу ФИАС в файл с SQL запросами.

Уж извиняйте за неказистый интерфейс, писал я ее для себя без ориентировки на общественность. И размещаю с мыслями: "малоли, вдруг еще кому понадобиться..."



Логика работы парсера


программа перелопачивает любой xml файл ФИАС и на выходе генерирует файл-дамп c SQL запросами который затем админом скармливается базе MySQL.
Программа работает в потоке, читает обрабатывает и сразу записывает результат, и не загружает оперативную память. Потоковость реализована буфером, в который читается 16кб фиаса, обрабатывается и сразу записывается, и опять читаем обрабатываем записываем пока не кончится.

Алгоритм работы с потоковым парсером zXML Parser или как переконвертировать ФИАС


    1. Запускаем программу.
    2. указываем входной xml файл от фиаса
    3. указываем выходной файл для готовых sql запросов
    4. жмем "попробовать", программа читает кусок xml файла в поле
    5. выделяем имя xml объекта (напр House или Object) содержащего нужные нам параметры (ячейки) таблицы фиас,
    6. Записываем имя этого объекта в поле "имя XML объекта"
    7. Указываем имя MySQL таблицы в которую будут направляться SQL запросы
    8. Жмем кнопку "сканер значений", программа начинает лопатить xml и вытаскивать существующшие значения
    9. подождем немного (5-10 сек), и останавливаем сканер значений тойже кнопкой
    10. жмем кнопку "<-", насканированные значения заполняют поле "Вытаскиваемые параметры"
    11. жмем кнопку "попробовать" еще раз, в поле "Результат после обработки XML" должны появится нужные SQL запросы.
    12. редактируем поле "вытаскиваемые параметры", убираем ненужные, оставляем нужные
    13. Пробуем еще раз нажав кнопку "попробовать" и если результат нас устраивает то см след пунк.
    14. Если нужно, выбираем кодировку в которой будет сохранен результат.
    15. Жмем кнопку "Work" и начинается процесс парсинга.


парсинг можно остановить.

Если вы запускали "сканер значений", то таблица значений (та что справа) заполнится. Ее можно отредактировать прям на месте, и нажать кнопку Make SQL в результате чего сгенерируется SQL запрос с для создания таблицы в базе ~SQL.
По умолчанию в этом запросе стоит тип таблицы MyISAM и кодировка cp1251, отредактируйте по усмотрению.

Все текущие настройки парсера на базу - можно сохранить нажав "файл -> Сохранить конфигу как..."
конфига сохранится в *.xpz файл - по сути это простой ini файл.

Для того чтобы xpz файлы открывались этим парсером жмем "настройки -> Ассоциировать *.xpz файлы с программой" или деассоциировать.

Вот примерно так все и работает, программа успешно парсит 7 гиговую базу домов за 15-30 минут, в зависимости от производительности вашего ПК

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

Дополнение от 19.12.2012
[+] Добавлена поддержка кодировки, пока только cp1251 (windows).
[+] Появилась версия у программы, теперь 1.1
Дополнение от 28.02.2013
[x] Исправлена ошибка, не конвертировало в utf-8 после добавления cp1251

Файл zXMLParser.zip Парсер / конвертер адресной базы ФИАС (FIAS) в файл SQL запросов для MySQL или MsSQL Размещен
размер 0.27 mb 2012-09-26 17:56:22
Скачан 1743


Если программа вам пригодилась - оставьте камент =)
Комментарии к записи:
MaxS 2012-10-15 14:13:19 [ответить]
Не нашел как сменить кодировку для файлов при парсинге. С UTF-8 проблемы.
=ZG= IP:95.170.187.9 2012-10-15 15:14:53 [ответить]
кодировку в программе не делал, сам кодировал через iconv после парсинга.
aveselov 2012-10-16 16:57:31 [ответить]
Прога станет очень восстребованной если еще и кодировка будет корректной
ZG 2012-10-18 01:00:22 [ответить]
кодировка такаяже как в xml Файлах фиаса, т.е. utf8.
в принципе могу и допилить кодировку, но для этого нужно както повысить уровень энтузиазма... =)
Алексей 2012-11-15 23:17:16 [ответить]
А в чем потоковость??? в том, что 7Гб файл пытаемся засунуть в 3Гб памяти и умираем по нехватке? офигенно...
=ZG= IP:95.170.187.9 2012-11-16 11:24:10 [ответить]
а так ли это? Алексей даже не проверил - а вывод уже сделал, вот что самое печальное =)
на протяжении всей работы, памяти занято не более 4-5мб, потоковость реализована буфером, в который читается 16кб фиаса, обрабатывается и сразу записывается, и опять читаем обрабатываем записываем пока не кончится.
Денис 2012-11-23 05:06:22 [ответить]
Спасибо, сэкономил мне время.
Георгий 2012-12-04 15:23:39 [ответить]
Вопрос к тем кто уже вливал в базы ФИАС, как вы боретесь с нестыковками базы ФИАС, собственно проблемы с тем что в таблице ADDROBJ есть ссылки на таблу NORMDOC а таких записей в таблице нет и в таблице AOGUID не уникален, хотя по документации ФИАС это глобальный уникальный идентификатор?
=ZG= 2012-12-04 15:43:54 [ответить]
да там вообще беспредел творится.. фиас это как пропасть в которую данные просто валятся и копятся.
Насколько я знаю там ничего никогда не удаляется, только помечается актуальна ли запись или нет, за актуальность _ВРОДЕ_ отвечает поле ACTSTATUS, или поля STARTDATE, ENDDATE.
...может вы смотрите не актуальные записи!?

Встречал в фиасе даже какието огрызки sql запросов в некоторых полях, и всяких левых символов в номерах домов полно...
Чего уж говорить о соответствии, тут в любом случае не обойтись без доработки молотком и напильником.
Георгий 2012-12-04 16:00:48 [ответить]
в таблице NORMDOC есть записи: "select T1501 from TN1500 where T1003=... - ГРН по которому изменилось местонахождение ИП". Собственно дело не в актуальности а как это всё хозяйство засунуть себе в базу. Либо не делать ссылки на таблицы так как часть записей ссылаются на то чего нет...
И еще вопрос в документе ФИАС предлагает таблице Кодов регионов России, где индексы идут: 1-79, 83, 86, 87, 89, 99. Но вот только у них же в таблице ADDROBJ имеются записи с кодом региона 85, они предлагают свою справочную таблицу сочинить?
=ZG= 2012-12-05 12:24:41 [ответить]
ну регион то 85й есть - "Усть-Ордынский Бурятский автономный округ (Россия)"
Анатолий 2012-12-19 02:28:55 [ответить]
Отличная программа. Очень пригодилась.
Но вот с кодировкой действительно бида
=ZG= 2012-12-19 16:14:52 [ответить]
Уговорили, сделал кодировку, конвертит в win 1251 =)
Lithium777 2013-02-14 01:22:14 [ответить]
Спасибо, дорогой. Еще не пробовал, но уже спасибо. Ибо это ад..
Олег 2013-02-27 20:41:57 [ответить]
проблема... сохраняет sql файл 0-ого размера (сайм файл создается - содержимое нет)
=ZG= IP:95.170.187.9 2013-02-27 20:46:13 [ответить]
отправь скриншот программы и кусок xml фала мне на почту zon@bk.ru, скажу в чем дело.
Олег 2013-02-27 20:47:12 [ответить]
выгрузка с UTF8 не пашет, 1251 выгружается
=ZG= IP:95.170.187.9 2013-02-28 11:32:00 [ответить]
Исправлено, выложил версию 1.2
Олег IP:77.95.92.99 2013-02-28 23:35:24 [ответить]
спасибо!!! )
Сергей 2013-03-01 00:21:12 [ответить]
можно было бы группировать инсерты но несколько записей (по 100 - 500). мускул бы быстрее засасывал такой здоровый файл. За прогу огроменное спасибо )
=ZG= IP:95.170.187.9 2013-03-01 08:32:51 [ответить]
Хотел я уже сделать такую штуку, Олег,. или Сергей )
Но что-то меня остановило. Посмотрим, может быть )
Zerg IP:188.134.38.8 2013-03-01 20:31:33 [ответить]
Я пошел простым путем )) я минут за 10 написал на PHP скрипт, он построчно читает файл запроса, выданный программой и импортирует в базу. Не изящно, но работает ))) Запустил, чаю попил - и вся база загружена )))
Zerg 2013-03-01 18:49:44 [ответить]
Огромный респект и уважуха! Уже хотел сам писать что-то подобное, т.к. не мог найти. Сэкономил кучу времени. Огромное спасибо за прогу!
Саня 2013-03-04 15:20:59 [ответить]
Спасибо!! очень достойная программа!
Zerg 2013-03-06 15:43:14 [ответить]
Столкнулся с таким моментом: Потрошил файл AS_ADDROBJ_20130223, сканер значений выдал 1543894 значения, но в базу импортировалось 1543895 значений. Это баг? или просто программа считает с 0?
=ZG= IP:95.170.187.9 2013-03-06 16:12:52 [ответить]
Сканер значений при старте прописывает 0 в count. При нахождении параметра в xml объекте - добавляет +1 к текущему значению count.
Взял для примера базу AS_CURENTST_20120917, в ней 99 значений, сканер нашел 99 и выдал 99 sql запросов.
Может где в базе кривой xml объект без полей закрался..
Но если это баг то он не подтвердился.
Tim_a 2013-03-31 01:57:45 [ответить]
LOAD XML LOCAL INFILE
астрал 2013-04-21 20:18:46 [ответить]
сорцы открой
Димм 2013-10-11 18:04:35 [ответить]
В windows 8 система блокирует программу... пишет, что типо защитила меня и не дала врагу навредить... вот так вот...
=ZG= IP:10.20.1.66 2013-10-11 18:19:29 [ответить]
ох уж эта виндовс восемь... незнаю, писал под win7, полет нормальный.
Beard 2013-12-13 03:03:33 [ответить]
Парсер генерирует запросы по одному для каждой записи. На майском дампе фиаса их слишком много, долго выполняются.

К тому же, в MySQL 5.5 есть фича импорта из XML http://dev.mysql.com/doc/refman/5.5/en/load-xml.html , правда дампы AS_ADDROBJ и AS_HOUSE для неё, кажется, тоже слишком большие. Пришлось сначала их разделить на куски по 400 Мб.
dtsiv 2014-01-11 23:02:20 [ответить]
Спасибо! Всё работает. А на чём программка писалась? или с нуля? Схемы XML (файлы XSD) для ФИАС не используются, а могут они пригодиться?
=ZG= IP:95.170.187.9 2014-01-12 00:38:39 [ответить]
Писалась с нуля, D7, без всяких xml компонентов.
Виктор IP:87.76.239.7 2014-01-30 03:08:57 [ответить]
Здравствуйте. Ломаю голову второй день. Конверторы DBF во что-то страшное, после чего при загрузке в sql вылазит ошибка. Для проекта надо всего лишь список полных адресов, от страны до номера дома (если есть). пробовал программой - виснет, ось 7. Может есть уже база в формате sql?
=ZG= IP:95.170.187.9 2014-01-31 15:36:59 [ответить]
Странно, при каких условиях виснет?
готовую базу в sql вроде не выпускают
Алексей IP:37.140.75.96 2014-08-08 01:03:24 [ответить]
Вот описание как экспортировать ФИАС в БД PostgreSQL при помощи схем XSD
http://wiki.gis-lab.info/w/%D0%A4%D0%98%D0%90%D0%A1
Евгений 2014-03-23 21:20:13 [ответить]
Добрый день!

Есть необходимость реализации проекта с участием базы данных фиас, ищу разработчика, если сможем обсудить этот вопрос пож. пишите на emelnik3@yandex.ru обговорим более детально.
Иван 2014-08-07 16:26:00 [ответить]
Очень кстати была бы функция разбиения выходного файла на части заданного размера. И указатель "не разбивать", естественно, как с кодировкой.
Иван 2014-08-20 19:43:07 [ответить]
Ах да, еще замечательно было бы выбирать какую функцию mysql генерировать. К примеру для обновлений фиаса я использую REPLACE, а не INSERT. Так импорт не крашится при попытке вставить строку с ключем, который уже есть в таблице.
SergAnt 2015-08-31 13:44:46 [ответить]
Большое человеческого спасибо за данную программулину
Alex 2016-03-15 16:07:12 [ответить]
Thank you very mach!
Сергей 2016-03-30 16:21:37 [ответить]
Шикарная программа! Спасибо!
Просто и сердито!
agatsky.dn 2016-04-29 18:03:36 [ответить]
Большое спасибо!
agatsky.dn 2016-04-29 18:03:48 [ответить]
Большое спасибо!
Tata10 2016-11-11 03:35:47 [ответить]
Большое спасибо! Еще бы добавить фильтр хотя бы по регионам.
А то слишком на выходе большой файл выходит, хотя обычно нужно 1-3 региона.
Виталик 2016-12-20 17:49:41 [ответить]
Спасибо, пригодилась программка )

Добавление комментария

Ваше имя: (Антиспам) Какой сейчас год?
Ваш комментариий: