Кладр формат файла отличен от dbf

Обновлено: 04.07.2024

1 июля 2014 года произошло одно из самых значимых событий в истории государства Российского: с этого момента у нас в стране наконец появилась эталонная база адресов по всем, даже самым малым населённым пунктам! Имя этой базе — ФИАС. Собственно, сам по себе справочник ФИАС появился гораздо раньше, но именно 1 июля вступил в силу ФЗ 443 , согласно которому все государственные и муниципальные структуры теперь должны опираться на него как на единственно верную базу адресов. Мы решили исследовать, стоит ли переходить на ФИАС, и с какими подводными камнями столкнутся те, кто решит это делать.

Прочитав статью, вы узнаете:

  • Чем отличается ФИАС от КЛАДР
  • Можно ли уже использовать ФИАС вместо КЛАДР
  • Стоит ли беспокоиться о переходе на ФИАС тем, кто уже работает с КЛАДР
  • Решит ли ФИАС текущие проблемы с адресами
  • Что ждёт тех, кто только начинает использовать адресные справочники
  • Какие есть самые заметные и важные проблемы при работе с ФИАС и КЛАДР

Почему не КЛАДР?

В настоящий момент времени основным адресным справочником России считается КЛАДР. Почему он не устроил людей, и откуда появилась необходимость в новом?

Изначально КЛАДР, скорее всего, задумывался как понятный структурированный справочник, содержащий актуальную информацию по адресам всей России. В настоящее время это, к сожалению, далеко от истины. Есть много особенностей в записях КЛАДР, и мы сейчас расскажем про самые интересные из них.

Ад в номерах домов или страшный сон программиста

Запись номера дома и его расширения (всё, что стоит после числа: корпус, строение, литера) в КЛАДР хранится одной строчкой через запятую. При этом общие правила формирования домовой части, описанные в документации, на практике далеко не всегда применяются. Так, если вы решите подключить КЛАДР вплоть до дома, то придется разобраться, что делать со следующими обозначениями:

Слабонервным не смотреть

Похоже, что из-за обилия различных написаний в справочнике запутываются даже его создатели, так как на одной улице можно часто встретить разные действующие записи одного дома. Например, в поселке Новый (Красногорский район Московской области) в КЛАДР есть запись с домом 8 и отдельно с двлд8. Теоретически, домовладение и дом — разные вещи, однако в реальности мало кто пишет «домовладение», и можно смело считать, что двлд и просто дом — одно и то же.

Где эта улица, где этот переулок?

В КЛАДР запись адреса разбита на уровни (регион, район, город, населённый пункт и улица), и для каждого уровня есть тип и наименование. Например, тип — автономный округ, наименование — Ямало-Ненецкий… К сожалению, не всегда можно точно определить, что наименование, а что тип. И не всегда понятно, что проблема КЛАДР, а что на самом деле так называется.

Лев или Толстой?

В КЛАДР много ошибок. Индексы из пяти символов, дублирующие записи домов с двойной нумерацией и прочее.

Вот некоторые из них более детально:

  • Отсутствуют улицы и даже населённые пункты. Особенно сильно проявляется для небольших населённых пунктов с населением менее 10 тысяч человек. Например, улица Госпитальная в пгт Монино Щелковского района Московской области есть на картах, но отсутствует в КЛАДР.
  • Дубли. По КЛАДР в Москве есть две разные улицы 8 Марта, которые, судя по индексу, сильно удалены друг от друга, и на них есть одинаковые дома. А ещё там же есть две улицы Шоссейные, одна из которых переименована в улицу Николая Сироткина, которых тоже две. Моя особая любовь — город Кореновск Краснодарского края: там, согласно КЛАДР, очень любят Толстого, так как есть улица Толстого, улица Льва Толстого и переулок Льва Толстого.
  • Медленная актуализация справочника. Построенная в прошлом году к Универсиаде в Казани Деревня Универсиады появилась там спустя полгода после завершения строительства, несмотря на то, что КЛАДР обновляется каждую неделю.
  • Частое отсутствие или необоснованное наследование индексов с более высоких уровней. Дом в подчинённом населённом пункте может иметь индекс главпочтампта в родительском городе, который сильно отдалён от этого дома. Например, улица Ленина в г. Нефтекамск в Башкортостане имеет индекс 450000, то есть главпочтампта в Уфе. При работе с индексами в таких случаях у нас есть своё ноу-хау. Мы возвращаем два индекса: индекс по КЛАДР для отчётности перед различными структурами и индекс для доставки корреспонденции, чтобы письмо все-таки дошло по адресу.

Вероятно, причина ошибок в том, что ответственными за актуальное состояние справочника являются органы местного самоуправления, и, возможно, вносимая информация никак не проверяется. Как бы там ни было, проблемы справочника усугубляются отсутствием поддержки: мы не раз писали письма в ФНС с указанием ошибок, но ни одна из них не была исправлена.

Так что если адрес есть в КЛАДР, то не факт, что он существует в реальной жизни, и наоборот.

Что с ФИАС

Давайте посмотрим, что представляет из себя ФИАС, и решает ли он проблемы КЛАДР.

Данные и структура

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

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

Качество информации о домах

В ФИАС есть две таблицы для домов. Структура данных сама по себе очень радует: для всего есть своё поле.

Первая таблица, HOUSE, содержит номера домов, и для каждого есть следующая информация:

  • Номер дома
  • Признак владения (владение, дом, домовладение, участок)
  • Номер корпуса
  • Номер строения
  • Признак строения (строение, сооружение, литер)
  • Индекс
  • Состояние дома

Какие основные отличия от таблицы домов в КЛАДР?

  • Структурирована информация о номере дома и его расширении. Записи вида двлд12стр1 приведены к нормальному виду.
  • Записи вида 11_13 приведены к 11-13. В КЛАДР, согласно документации, через дефис записываются интервалы домов (много домов в одной записи), поэтому дефис в номерах домов приходилось заменять на нижнее подчеркивание. В ФИАС этой проблемы нет. Одна строка — один дом.
  • Фиксированный ID для каждого дома.
  • Не решена проблема домов с двойной нумерацией: для них может быть различное количество не связанных записей, а в номере дома могут содержаться как записи с дробью вида 6/9/20, так и просто числа. Например, в Казани есть адреса Кремлёвская 23 , Кремлёвская 23/17 и Кави Наджми 17/23 , которые обозначают одно и то же здание
  • Часто встречаются случаи, когда в номере дома содержится литера (по идее она должна уходить в соответствующее поле ФИАС — номер строения). Ещё иногда встречаются записи вида «38/1УЧ».
  • В номерах домов встречаются откровенные ошибки, например, «08а» и «0п». (Update: удалось выяснить, что дом 08А реально существует, спасибо bay73 )
  • Дубли домов, не существующие в реальной жизни дома, отсутствующие записи для существующих домов, отсутствие индексов и их неправильное наследование — ничего не улучшилось по сравнению с КЛАДР.

Вторая таблица с домами, HOUSEINT, содержит интервалы домов. В КЛАДР в таблице домов содержатся записи вида Н(1-999), — это означает все нечётные дома из интервала 1 – 999. В ФИАС они разбиты на поля: начало интервала, конец, и его признак. К сожалению, содержимое этой таблицы так же далеко от истины, как и в КЛАДР: например, в Кирове есть неправдоподобно длинная улица Щорса, на которой есть все дома в диапазоне от 1 до 9999.

Качество всего остального

Посмотрим чуть выше — на адресные объекты вплоть до улицы. Они находятся в таблице ADDROBJ.

  • ГСК, СНТ и прочие объекты такого рода вынесены вместе с их подчинёнными улицами на отдельные уровни. В КЛАДР они находились на уровне населённых пунктов, что создавало путаницу.
  • Добавилась таблица LANDMARK, в которой в свободной форме записано как найти адрес (например, «в 0,8 км к северо-востоку от села Лопатино» или «МКАД, 84-й км»). И хотя таблица пока небольшая, она показалась мне очень перспективной, особенно если её отдать в опенсорс на пополнение.
  • Проблемы с регионами до сих пор не решены: у Чувашской республики тип Чувашия, у Ханты-Мансийского автономного округа тип находится в наименовании и т.д. Конечно, по документам так и должно быть, но, мне кажется, что одной из основных задач адресного справочника является приведение адресов к стандартному виду.
  • В ФИАС есть отдельный уровень для автономных округов, но на нём нет объектов, а все автономные округа находятся на 1-м. Вероятно, это поле планируется использовать подо что-то другое.
  • ФИАС содержит все те же адреса, что и КЛАДР, со всеми его ошибками.

Формат

ФИАС доступен в трёх видах: формат КЛАДР, dbf и xml. Последний мне показался наиболее удобным — файлы не разбиваются по регионам в отличие от dbf, а хранятся в скомпонованном виде в xml. Однако вес исходного справочника в таком формате составляет около 14Гб.

ФИАС в формате dbf весит 9Гб вместо 14Гб, однако имеет не очень удобную структуру: таблицы домов и нормативных документов разбиты по регионам, и в итоге ФИАС в таком представлении содержит 187 файлов.

ФИАС в формате КЛАДР по сути и наполнению — то же самое, что и сам КЛАДР, за редким исключением, и весит он те же самые 330Мб. Построчное сравнение таблиц КЛАДР и ФИАС в формате КЛАДР выявило менее 0.1% расхождений, которые, вероятно, вызваны разным временем выгрузки рассматриваемых баз КЛАДР и ФИАС.

Что думает бизнес

Как может повлиять на работу переключение с КЛАДР на ФИАС? Готов ли бизнес переходить на этот справочник?

Наши коллеги из банков, для которых использование адресной информации является ключевым на всех этапах, не видят бизнес преимуществ перехода на ФИАС, однако планируют это делать, чтобы соответствовать требованиям регулятора. Из-за перехода всех федеральных агентств, министерств и ведомств на ФИАС в перспективе могут возникнуть требования использовать ФИАС при общении с ними (госуслуги, СМЭВ, отчетность, ЦБ).

Выводы

Самой большой проблемой официальных справочников в России была и остаётся неактуальность представленной информации. Пока не будет нормальной налаженной системы по пополнению ФИАС, не будет проверяться качество данных и не будет произведён рефакторинг того, что уже есть в справочнике, мы будем встречаться со всеми теми же проблемами, что и в КЛАДР.

Основными плюсами ФИАС являются начальные попытки стандартизации адресов и наличие стабильного ключа для каждого дома.

  • ФИАС содержит больше полезной информации, чем КЛАДР: ID, дата начала и окончания действия записи, детализация статуса действия над объектом.
  • В ФИАС лучше организовано представление информации: информация о домовой части разбита на компоненты, добавлен уровень для дополнительных территорий и их улиц.
  • Файлы ФИАС значительно тяжелее КЛАДР в исходном виде: 9Гб вместо 300Мб.
  • КЛАДР и ФИАС по содержанию и актуальности адресов суть одно и то же более чем на 99.9%.
  • Подключение ФИАС и КЛАДР в приложение с нуля примерно равнозначно по сложности: в случае с КЛАДР придётся разбираться с домовой частью, а с ФИАС — что можно безблезненно удалить, чтобы ужать вес справочника. В обоих случаях нужно будет разобраться с качеством данных, что займёт больше всего времени.
  • Идентификатор ФИАС в перспективе может потребоваться при работе с внешними системами: госуслуги, СМЭВ, отчетность, ЦБ.

Итак, пока переход на ФИАС имеет смысл только как задел на будущее. Если вы уже работаете с КЛАДР и не взаимодействуете со внешними системами, то можно не переходить на ФИАС, а использовать КЛАДР дальше. Если вы только начинаете своё знакомство с адресами и планируете подключать их в свой продукт, или вам требуется отчётность и интеграция, то стоит выбирать ФИАС.

И так приступим…

Скачиваем базу КЛАДР с выше указанного адреса, распаковываем.

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

Запускаем Microsoft Access. Выбираем открыть. Тип файлов -> все файлы,

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

выбираем файл STREET.DBF и нажимаем открыть. Затем снова выбираем открыть. Тип файлов -> все файлы и выбираем следующий файл DBF. И так делаем со всеми файлами и закрываем MS Access. Если вы все сделали правильно то в папке с КЛАДР должны появится следующие файлы в формате MS Access:

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

Сейчас двойным кликом мыши открываем файл STREET.accdb. Затем запускаем еще одну копию MS Access. В ней выбираем Создать:

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

указываем путь и задаем имя файла kladr.mdb и жмем кнопку создать. В открывшемся окне удаляем Таблицу1 и перетаскиваем в него нашу таблицу STREET.accdb из уже запущенного MS Access.

В этой статье мы научимся конвертировать базу КЛАДР из формата dbf в формат файлов Microsoft Access 2003 – 2007.

Затем не закрывая нашу базу kladr.mdb мы последовательно открываем все файлы с расширением accdb и перетаскиваем их в базу kladr.mdb. В итоге должно получиться следующее:

В этой статье мы научимся конвертировать базу КЛАДР из формата dbf в формат файлов Microsoft Access 2003 – 2007.

Закрываем базу кладр.

Сейчас немного о структуре самого КЛАДР.
Классификатор оформлен в виде следующих DBF-файлов:
файл Kladr.dbf – содержит записи с объектами первых четырех уровней классификации (регионы; районы (улусы); города, поселки городского типа, сельсоветы; сельские населенные пункты);
Структура кодового обозначения в блоке "Код":
СС РРР ГГГ ППП АА, где
СС – код субъекта Российской Федерации (региона), коды регионов представлены в Приложении 2 к Описанию классификатора адресов Российской Федерации (КЛАДР);
РРР – код района;
ГГГ – код города;
ППП – код населенного пункта,
АА – признак актуальности адресного объекта.

Признак актуальности может принимать следующие значения:
"00” – актуальный объект (его наименование, подчиненность соответствуют состоянию на данный момент адресного пространства).
"01”-"50” – объект был переименован, в данной записи приведено одно из прежних его наименований (актуальный адресный объект присутствует в базе данных с тем же кодом, но с признаком актуальности "00”;
"51” – объект был переподчинен или влился в состав другого объекта (актуальный адресный объект определяется по базе Altnames.dbf);
"52”-"98” – резервные значения признака актуальности;
”99” – адресный объект не существует, т.е. нет соответствующего ему актуального адресного объекта.
файл Street.dbf – содержит записи с объектами пятого уровня классификации (улицы городов и населенных пунктов);
Структура кодового обозначения в блоке "Код":
СС РРР ГГГ ППП УУУУ АА, где
СС – код субъекта Российской Федерации (региона), коды регионов представлены в Приложении 2 к Описанию классификатора адресов Российской Федерации (КЛАДР);
РРР – код района;
ГГГ – код города;
ППП – код населенного пункта;
УУУУ – код улицы;
АА – признак актуальности наименования адресного объекта.

файл Doma.dbf – содержит записи с объектами шестого уровня классификации (номера домов улиц городов и населенных пунктов);
файл Flat.dbf – содержит записи с объектами седьмого уровня классификации (номера квартир домов);
файл Socrbase.dbf – содержит записи с краткими наименованиями типов адресных объектов;
файл Altnames.dbf –содержит сведения о соответствии кодов записей со старыми и новыми наименованиями адресных объектов, а также сведения о соответствии кодов адресных объектов до и после их переподчинения.
Более подробно у структуре классификатора можно узнать из справки, которая поставляется вместе с ним.

А сейчас приступим к написанию простейшего приложения, которое позволит сформировать интересующий нас адрес.
Запустим Delphi и создадим новое приложение. Создадим папку и сохраним в нее наше приложение. Скопируем в эту папку наш созданный в MS Access файл kladr.mdb.

Далее приступим к созданию формы:


Разместим на форме следующие компоненты:
- Четыре компонента TDBLookupComboBox;
- Три компонента TEdit;
- Четыре компонента TADOQuery;
- Четыре компонента TDataSource;
- Компонент TADOConnection;
и шесть компонентов TLabel.
Все компоненты разместим и переименуем, как показано на рисунке.

Далее сделаем подключение через компонент ADOConnectio1 к нашей базе kladr.mdb. Для этого выберем свойство ConnectionString в открывшемся окне выберем Build…--> затем Microsoft Jet 4.0 OLE DB Provider --> затем далее и в открывшемся окне:

Далее сделаем подключение через компонент ADOConnectio1 к нашей базе.

выбираем путь к нашей базе (затем путь можно удалить и оставить только имя kladr.mdb, чтобы убрать привязку к конкретному пути). Жмем ОК. Затем свойство LoginPrompt устанавливаем False, свойство Connected ->True.
На этом подключение закончено. Переходим к настройке других компонентов. Выбираем компонент region_source и свойство DataSet --> kladr_region. Выбираем компонент kladr_region и свойство Connection устанавливаем ADOConnection1. В свойство SQL-> TStrings…-> пишем следующий запрос:

SELECT *
FROM KLADR
WHERE (((KLADR.CODE) Like '__000000000__'));

В этом запросе я выбираю из таблицы kladr все поля по условию Like '__000000000__' для поля CODE. В команде Like '__000000000__', _ обозначает произвольный символ. Поэтому мы ищем произвольный код субъекта федерации (первые два символа кода) и произвольный признак актуальности (последние два символа).
Свойство Active устанавливаем True.

Затем переходим к настройке компонента DBLookupComboBox1. Свойство ListSource -> region_source, свойство ListField-> NAME;SOCR свойство KeyField->CODE.

Для события OnCloseUp пишем следующий код:

procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
//формируем запрос с параметрами на выбор района
street.Active:=false;//выключаем запрос
kladr_gorod.Active:=false;//выключаем запрос
kladr_raion.Active:=false; //выключаем запрос
kladr_raion.SQL.Clear; //очищаем запрос
kladr_raion.Parameters.AddParameter.Name:='a'; //добавляем параметр 'a'
kladr_raion.Parameters.ParamByName('a').DataType:=ftWideString;//задаем тип параметра
kladr_raion.Parameters.AddParameter.Name:='b'; // добавляем параметр 'b'
kladr_raion.Parameters.ParamByName('b').DataType:=ftWideString; //задаем тип параметра
kladr_raion.Parameters.AddParameter.Name:='c'; // добавляем параметр 'c'
kladr_raion.Parameters.ParamByName('c').DataType:=ftWideString; //задаем тип параметра
//формируем запрос
kladr_raion.SQL.Add('SELECT *');
kladr_raion.SQL.Add('FROM KLADR');
kladr_raion.SQL.Add('WHERE (((KLADR.CODE Like :a Or KLADR.CODE Like :c)) And Not ((KLADR.CODE) Like :b));');
//в параметре 'а' выбираем по коду региона все районы
kladr_raion.Parameters.ParamByName('a').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,2)+'___000000__';
//параметр 'b' нужен для исключения из списка самого региона
kladr_raion.Parameters.ParamByName('b').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,2)+'000000000__';
//параметр 'c' нужен для выбора городов и населенных пунктов не входящих в районы
kladr_raion.Parameters.ParamByName('c').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,2)+'000________';
//активируем запрос
kladr_raion.Active:=true;

//формируем запрос с параметрами на выбор названия улицы
street.Active:=false;
street.SQL.Clear;
street.Parameters.AddParameter.Name:='a';
street.Parameters.ParamByName('a').DataType:=ftWideString;
street.SQL.Add('SELECT *');
street.SQL.Add('FROM STREET');
street.SQL.Add('WHERE (((STREET.CODE) Like :a));');
//в параметре 'а' выбираем по коду населенного пункта все улицы в нем
street.Parameters.ParamByName('a').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,11)+'______';

//активируем запрос
street.Active:=true;
end;

Выбираем компонент raion_source и свойство DataSet --> kladr_raion. Выбираем компонент kladr_raion и свойство Connection устанавливаем ADOConnection1.
Затем переходим к настройке компонента DBLookupComboBox2. Свойство ListSource -> raion _source, свойство ListField-> NAME;SOCR свойство KeyField->CODE.

Для события OnCloseUp пишем следующий код:

procedure TForm1.DBLookupComboBox2CloseUp(Sender: TObject);
begin
street.Active:=false;
kladr_gorod.Active:=false;
//проверяем, если был выбран не город (населенный пункт),
//то формируем запрос на выбор населенного пункта
if copy(raion_source.DataSet.FieldByName('CODE').Value,3,3)<>'000' then
begin
//формируем запрос с параметрами на выбор населенного пункта
kladr_gorod.SQL.Clear;
kladr_gorod.Parameters.AddParameter.Name:='a';
kladr_gorod.Parameters.ParamByName('a').DataType:=ftWideString;
kladr_gorod.Parameters.AddParameter.Name:='b';
kladr_gorod.Parameters.ParamByName('b').DataType:=ftWideString;
kladr_gorod.SQL.Add('SELECT *');
kladr_gorod.SQL.Add('FROM KLADR');
kladr_gorod.SQL.Add('WHERE ((KLADR.CODE Like :a And Not ((KLADR.CODE) Like :b)));');
//в параметре 'а' выбираем по коду района все населенные пункты
kladr_gorod.Parameters.ParamByName('a').Value:=copy(raion_source.DataSet.FieldByName('CODE').Value,1,5)+'________';
//параметр 'b' нужен для исключения из списка самого района
kladr_gorod.Parameters.ParamByName('b').Value:=copy(raion_source.DataSet.FieldByName('CODE').Value,1,5)+'000000__';
//активируем запрос
kladr_gorod.Active:=true;
end;
//формируем запрос с параметрами на выбор названия улицы
street.Active:=false;
street.SQL.Clear;
street.Parameters.AddParameter.Name:='a';
street.Parameters.ParamByName('a').DataType:=ftWideString;
street.SQL.Add('SELECT *');
street.SQL.Add('FROM STREET');
street.SQL.Add('WHERE (((STREET.CODE) Like :a));');
//в параметре 'а' выбираем по коду населенного пункта все улицы в нем
street.Parameters.ParamByName('a').Value:=copy(raion_source.DataSet.FieldByName('CODE').Value,1,11)+'______';
//активируем запрос
street.Active:=true;
end;

Выбираем компонент gorod_source и свойство DataSet --> kladr_gorod. Выбираем компонент kladr_gorod и свойство Connection устанавливаем ADOConnection1.
Затем переходим к настройке компонента DBLookupComboBox3. Свойство ListSource-> gorod_source, свойство ListField-> NAME;SOCR свойство KeyField->CODE.

Для события OnCloseUp пишем следующий код:

procedure TForm1.DBLookupComboBox3CloseUp(Sender: TObject);
begin
//формируем запрос с параметрами на выбор названия улицы
street.Active:=false;
street.SQL.Clear;
street.Parameters.AddParameter.Name:='a';
street.Parameters.ParamByName('a').DataType:=ftWideString;
street.SQL.Add('SELECT *');
street.SQL.Add('FROM STREET');
street.SQL.Add('WHERE (((STREET.CODE) Like :a));');
//в параметре 'а' выбираем по коду населенного пункта все улицы в нем
street.Parameters.ParamByName('a').Value:= copy(gorod_source.DataSet.FieldByName('CODE').Value,1,11)+ '______';
street.Active:=true;
end;

Выбираем компонент street_source и свойство DataSet --> street. Выбираем компонент street и свойство Connection устанавливаем ADOConnection1.

Затем переходим к настройке компонента DBLookupComboBox4. Свойство ListSource ->street_source, свойство ListField-> NAME;SOCR свойство KeyField->CODE.

К сожалению, работать с номерами домов на много сложнее, поэтому их быстрее забить руками.


Для увеличения скорости обработки запросов базу КЛАДР можно почистить, например удалить все не актуальные объекты (признак актуальности в коде не равен 00) и т.д.

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

В текущей задачи понадобилась база регионов и городов. Т.к. базы в открытом доступе старые, могут содержать ошибки, неточные данные и просто не из первоисточника - решено было найти источник данных и импортировать к себе в базу.

Поиск

Довольно быстра была найдена ссылка с файлами База данных Федеральной Информационной Адресной Системы далее ФИАС. На этой странице обнаружилась как база данных ФИАС так и в старом формате КЛАДР. По совету ruskar решено использовать базу в новом формате ФИАС, т.к. она более полная и обновляется.

Я скачал базу в формате DBF (не знаю хорошо это или плохо), весом 1 ГБ (в формате XML она на 500 МБ больше). Далее встал вопрос чем эту базу открыть и что с ней делать, ведь LINQ и Entity Framework просто так с DBF не работают. Однако приятно увидился, когда удалось открыть обычным Excel (не Access)

Открытие файла DBF Excel

Импорт DBF в SQL Server 2012

Нам понадобятся 2 тиблицы: ADDROBJ.DBF и SOCRBASE.DBF, в которых находятся все адресные объекты и сокращения соответственно.

база Short

Открываем SQL Server Management Studio, выбираем базу куда необходимо импортировать выбранные таблицы: Tasks > Import Data…

Import шаг 1

Создание строки подключения к DBF в Visual Studio

Нажимаем “Add Connection”. В качестве Data Source выбираем

Connection 1

В Data Source Specification > Use Connection String > Build… Создаем (выбираем) источник данных. Для начала его необходимо создать.

Создание соединения с DBF

После всех манипуляций получится такое диалоговое окно с готовой строкой подключения. Ее нужно скопировать, и вставить в MS SQL Server Management.

Готовая строка подключения к базе

Продолжаем импорт

Вставляем строку подключения к базе данных в диалоговое окно и жмем <Enter>. Она автоматически распарсится и поля сами подставятся в нужные ячейки.

Выбор строки подключения к DBF

На втором шаге выбираем базу назначения

База данных приемник

Далее оставляем пункт по умолчанию: Copy data from one or more tables or views.

Теперь необходимо выбрать таблицы для импорта и настроить Mapping. Выбираем таблицы ADDROBJ и таблицу с сокращениями. Рассмотрим настройку Mapping для таблицы адресов. По умолчанию в поле Type подставляются коды типов из базы DBF, однако в MS SQL нет типа “22” и пр. Поэтому необходимо проанализировать тип и установить правильный.

Ошибка в типах

Я меняю тип 22 на varchar, а 23 на date с длиной как в исходной базе. Получится примерно следующее:

Настроенный Mapping

После успешной настройки mapping произойдет процедура импорта, длится она несколько минут.

Импорт

В итоге получится база данных MS SQL с данными регионов и адресов всех объектов в Российской Федерации (по данным ФИАС).

Работа с данными

Конечно импорт из DBF в MS SQL интересное занятие но толку он этих данных не очень много без предварительной обрабоки.

Для того, чтобы получить список регионов (субъектов РФ) необходимо выполнить стандартные процедуры по настройке Entity Framework. Далее следующий код возвращает список регионов.

Для в каждом регионе есть REGIONCODE - код региона. Его следует запомнить, по этому коду можно легко и удобно получить города.

Таким образом можно сделать свою базу регионов и городов в формате SQL Server

В текущей задачи понадобилась база регионов и городов. Т.к. базы в открытом доступе старые, могут содержать ошибки, неточные данные и просто не из первоисточника - решено было найти источник данных и импортировать к себе в базу.

Поиск

Довольно быстра была найдена ссылка с файлами База данных Федеральной Информационной Адресной Системы далее ФИАС. На этой странице обнаружилась как база данных ФИАС так и в старом формате КЛАДР. По совету ruskar решено использовать базу в новом формате ФИАС, т.к. она более полная и обновляется.

Я скачал базу в формате DBF (не знаю хорошо это или плохо), весом 1 ГБ (в формате XML она на 500 МБ больше). Далее встал вопрос чем эту базу открыть и что с ней делать, ведь LINQ и Entity Framework просто так с DBF не работают. Однако приятно увидился, когда удалось открыть обычным Excel (не Access)

Открытие файла DBF Excel

Импорт DBF в SQL Server 2012

Нам понадобятся 2 тиблицы: ADDROBJ.DBF и SOCRBASE.DBF, в которых находятся все адресные объекты и сокращения соответственно.

база Short

Открываем SQL Server Management Studio, выбираем базу куда необходимо импортировать выбранные таблицы: Tasks > Import Data…

Import шаг 1

Создание строки подключения к DBF в Visual Studio

Нажимаем “Add Connection”. В качестве Data Source выбираем

Connection 1

В Data Source Specification > Use Connection String > Build… Создаем (выбираем) источник данных. Для начала его необходимо создать.

Создание соединения с DBF

После всех манипуляций получится такое диалоговое окно с готовой строкой подключения. Ее нужно скопировать, и вставить в MS SQL Server Management.

Готовая строка подключения к базе

Продолжаем импорт

Вставляем строку подключения к базе данных в диалоговое окно и жмем <Enter>. Она автоматически распарсится и поля сами подставятся в нужные ячейки.

Выбор строки подключения к DBF

На втором шаге выбираем базу назначения

База данных приемник

Далее оставляем пункт по умолчанию: Copy data from one or more tables or views.

Теперь необходимо выбрать таблицы для импорта и настроить Mapping. Выбираем таблицы ADDROBJ и таблицу с сокращениями. Рассмотрим настройку Mapping для таблицы адресов. По умолчанию в поле Type подставляются коды типов из базы DBF, однако в MS SQL нет типа “22” и пр. Поэтому необходимо проанализировать тип и установить правильный.

Ошибка в типах

Я меняю тип 22 на varchar, а 23 на date с длиной как в исходной базе. Получится примерно следующее:

Настроенный Mapping

После успешной настройки mapping произойдет процедура импорта, длится она несколько минут.

Импорт

В итоге получится база данных MS SQL с данными регионов и адресов всех объектов в Российской Федерации (по данным ФИАС).

Работа с данными

Конечно импорт из DBF в MS SQL интересное занятие но толку он этих данных не очень много без предварительной обрабоки.

Для того, чтобы получить список регионов (субъектов РФ) необходимо выполнить стандартные процедуры по настройке Entity Framework. Далее следующий код возвращает список регионов.

Для в каждом регионе есть REGIONCODE - код региона. Его следует запомнить, по этому коду можно легко и удобно получить города.

Таким образом можно сделать свою базу регионов и городов в формате SQL Server

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