PDA

Просмотр полной версии : Структура КЛАДР


lirien
26.05.2008, 07:06
Ктонить разбирался с КЛАДР?

Необходимо реализовать доступ к классификатору адресов. Т.е. чтобы можно было выбрать Регион затем город затем улицу затем дом.

Щас полез разбираться - дремучий лес :(

Нашел несколько статей - читаю.
Пока я в ужасе! :)

Вот. Собственно Хелп :)

lirien
28.05.2008, 08:00
Немного разобрался..
с кодами регионов, городов и населенных пунктов..
хрень та еще..

осталось еще разобраться с номерами домов..
т.к. они записаны одной строкой для каждой улицы..
вроде 1,4,7,Ч(8-32),Н(9-33),32\18, 40А
ну и в такомже духе..

я понимаю что Ч(8-32) это четные номера домов от 8 до 32
но как мне выполнить проверку что выбранный номер дома
входит в этот диапазон??

да я разобью эту строку в массив
и буду работать только с элементом Ч(8-32)
и я знаю что пользователь ввел номер дома 30
как мне узнать что этот номер входит в этот диапазон,
а если ввел 31 то не входит...

:(

Хелп плис

KEVin V.
28.05.2008, 08:14
С радостью бы помог, но понятия не имею о чем ты ^_^

lexus
28.05.2008, 08:28
Если номер дома на 2 без остатка делится, то в Ч. Или придумай более изящное описание чётности. ;)

lirien
28.05.2008, 11:07
Это не я придумал, это так есть в базе КЛАДР
"Классификатор адресов" он используется в налоговой и бухгалтерской
отчетности..

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

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

например вот так вот:
6,10,11,13,17,Ч(14-22),Н(23-35)
или вот так вот:
10/2,5/13,9/20,19/22,20/17,34/15,Ч(4-8)

т.е. такая вот строчка для каждой улицы..
возможно для каждой улицы есть несколько таких строчек.. еще не смотрел..


вот.. мне вот этоу вот строку:
10/2,5/13,9/20,19/22,20/17,34/15,Ч(4-8)

нужно както разобрать на отдельные дома чтобы можно было както
ими оперировать..

lexus
28.05.2008, 12:44
Ни чего не понятно. Изложи хоть немного: что за инструменты в твоём распоряжении, что можно с этой базой делать и чего нельзя? Тебе только читать базу, или писать в неё (в этом же формате?)? Можно её преобразовать?

lirien
28.05.2008, 13:05
Так. В моем распоряжении:
IIS 6.0 ASP.NET (C#) и ASP (JavaScript)
т.е. или C# или Javascript

База dbf не помню какого формата.. не важно
я с ней цепляюсь нормально и нормально читаю из нее данные

И в моих планах перенести данные из dbf в MS SQL Server
но убрать лишние и расставить свои индексы и ключи...

Все зашибись кроме одного:
мне нужно из строчки:

6,10,11,13,17,Ч(14-22),Н(23-35)

получить строчку:

6,10,11,13,17,14,16,18,20,22,23,25,27,29,31,33,35

Т.е.

Ч(14-22) == 14,16,18,20,22
Н(23-35) == 23,25,27,29,31,33,35

причем диапазон может быть любой (за исключением отрицательных чисел)

Т.е. нужно регулярное выражение или просто алгоритм\функция
чтобы выполнить это преобразование.

lexus
28.05.2008, 14:31
Не упирайся ты в чётность/нечётность.
Если при чтении натыкаешься на '(' записывай следующие за скобкой цифры в переменую1, пока не прочитаешь '-' ; записывай следующие за минусом цифры в переменную2, пока не прочитаешь ')' ; затем в цикле пока переменная1 не станет равна переменной2 прибавляй к переменной1 двойку и пиши в итоговую строку.

shurutov
28.05.2008, 20:45
lirien, ты мене извини, но кто ты по специальности?! Ну-ка быстро нарисовал конечный автомат, на базе которого будешь парсить строку адресов!!!
ЗЫ. После нарисования автомата все вопросы отпадут сами собой.
ЗЫЫ. Перлом и регулярными выражениями эта задача решается в одну-две строки, тупо лень думать даже...

lirien
29.05.2008, 05:48
спасибо :) но моя специальность не связана с программированием
или с какой бы то нибыло техникой вообще
хоть я и знаю 4 языка программирования.. и активно пользуюсь ими..

Slon
29.05.2008, 08:42
тама ещё какие нить хитровыебанные обозначения кучи домов, кроме ч() и н() есть ??

lirien
29.05.2008, 08:55
Все.. проблему решил..
Кинул сюда на обсуждение так как была куча других задач

Решилось все одной элементарной строчкой регулярных выражений и небольшим циклом формирую из Ч(30-36) строку 30,32,34,36 и добавляю к общей строке номеров.. в дальнейшем конкретный номер можно будет извлечь из строки методом split

Всем большое спасибо!

Slon
29.05.2008, 09:07
Пользователь вводит дом, начинаешь по строке идти - встретишь простое число - проверка на равенство. Встречаем составное - вычленяем 1ое и последнее и методом прибавления 2х к первому числу сравниваешь со всей последовательностью. В такой регексп должен вписаться составной номер дома [н|ч]\([0-9]{1,4}\-[0-9]{1,4}\).
Сравнивать в цикле с последовательностью по моему быстрее, чем сравнивать с диапазоном и проверять чётность.

Slon
29.05.2008, 09:09
добавляю к общей строке номеров
а я дурак думал, что данные изменять низя и составление строчек на лету - расход памяти ... эхххх, regexp то покажи хоть

lirien
29.05.2008, 11:09
var reg_num=/^(?:Ч|Н)\((\d+)-(\d+)\)$/;
var check_num=/^(?:Ч|Н)\(\d+-\d+\)$/;

lirien
29.05.2008, 11:12
Мне тут понимаешь ли расход памяти не важен..
эта операция будет производиться не чаще раза в месяц..
а может и не чаще квартала или полугода..

просто перенос базы кладр по Кемерово из dbf в MSQ SQL

а дальше уже только запросы чтения и т.д. и т.п. работа с базой

Sir Arthur
29.05.2008, 16:46
эм, я возможно глупость ляпну.
Проверить на четность/нечетность div (mod) можно ведь?

Slon
29.05.2008, 19:43
Вить. Там не только чётность, но и диапазон. Если расход памяти не важен - можно и дивом, а потом на диапазон.

Но при обработке данных на лету в условиях экономии (ну или хотябы в целях оптимизации) лучше распаковывать по мере надобности.

ИМХО

lirien
29.05.2008, 20:25
Ну насчет определения четности нечетности не беспокойтесь :)
тут большое спасибо Лексусу :)

все просто.. диапазон от 30 до 38 только четные..
прибавляем двойку в цикле

диапазон от 31 до 39 - только нечетные
прибавляем двойку в цикле

и все ок :)

а проверку на присутствие в перечне номеров домов
можно проводить также - элементарным регулярным выражением..