Что нового

Генератор случайных адресов из КЛАДРа

pad0nak66

Новичок
Сообщения
23
Репутация
2
Задача: Необходимо из КЛАДРа сгенерировать случайный адрес. База КЛАДРа - это 6 DBF файлов, которые объединены по кодам.

Комментарий: Ключевым полем почти во всех файлах является "CODE".
Если CODE = 13 символам, то:
  • первые 2 цифры - регион
  • следующие 3 цифры - район
  • следующие 3 цифры - город
  • следующие 3 цифры - населённый пункт
  • следующие 2 цифры - доп. индекс
Если CODE = 17 символам, то:
  • первые 2 цифры - регион
  • следующие 3 цифры - район
  • следующие 3 цифры - город
  • следующие 3 цифры - населённый пункт
  • следующие 4 цифры - улица
  • следующие 2 цифры - доп. индекс

На выходе хотелось бы получить массив:
Код:
$array[0] ; ОКАТО (поле OKATD)
$array[1] ; ИФНС (поле GNINMB)
$array[2] ; почтовый индекс (поле INDEX)
$array[3] ; регион
$array[4] ; район
$array[5] ; город
$array[6] ; населённый пункт
$array[7] ; улица
$array[8] ; дом
$array[9] ; корпус
$array[10] ; квартира


Пытался сделать всё сам, но от этих кодов идёт голова кругом :stars:
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
И что, нет желающих заморочиться на такую полезную вещицу? Думаю данный пример был бы очень полезен для дополнения к какой либо программулины для автореги или ещё какой.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Интересно, а вот читать файлы как иными программами? Я после публикации темки нашел какую то DBFView, предлагаете информацию читать с таких программ? Или как вести счет данных?
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
Я обычно через DBFNavigator открываю, а если под рукой нет, то использую MS Excel. Или я вопрос не так понял?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
аа, не знал что через excel можно, попробую решить задачку


Добавлено:
Сообщение автоматически объединено:

База КЛАДРа - это 6 DBF файлов, которые объединены по кодам.
А как это они объединены. Предположим что мы сможем сгенерировать число
Код:
Random(1000000000000,9900000000200,1);Числовая база колонки CODE из файла KLADR.BDF

Тогда откуда брать еще значения для массива, если числовая база не сходится с другими файлами(т.е. не во всех файлах те же самые числа в колонке CODE), или я не совсем понял про генерируемое рандомом число может № ячейки?(Если база составлена без разброса)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
pad0nak66 На заметку:
DOMA.DBF - 216мб
KLADR.DBF - 17мб, который загружается библиотекой Excel уже 8 минут.

Так то сделать можно быстро, но без проверки - вас устроит?
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
MnM Немного не такой ход мысли. Объясню как я это вижу. Я пытался сделать это в массиве. Для начала получаем все возможные записи первой группы (т.е. это те, у которых заполнены только первые 3 цифры, остальные должны быть нули), например 0660000000000 - Свердловская область и т.д.... помещаем все записи 1-й группы в массив, затем из массива берём случайную запись (номер), теперь ищем все записи второй группы, которые входят в 1-ю группу, например 0661500000000, помещаем в массив, ну и т.д.
Т.е. ни в коем случае не должны придумывать числа сами (рандомно), всё должно выбираться из имеющегося.

firex Excel-ем я пользуюсь крайне редко (при острой необходимости), потому как он действительно тугодум в этом плане.
Так то сделать можно быстро, но без проверки - вас устроит?
А почему бы и нет :smile:
 

XpycT

Скриптер
Сообщения
380
Репутация
133
pad0nak66
А можно привести пример с явными данными из базы???




Добавлено:
Сообщение автоматически объединено:

pad0nak66
Вот что пока получилось, проверяйте
Код:
#Include <Array.au3>
#NoTrayIcon

Global $sBase = @ScriptDir & "\BASE" ; папка где находяться DBF файлы

Global $aRslt[11][2], $aRows

Global $oDBConn = ObjCreate("ADODB.Connection"), $oDBRSet = ObjCreate("ADODB.RecordSet")
$oDBConn.Provider = "Microsoft.Jet.OLEDB.4.0"
$oDBConn.Open("Data Source=" & $sBase & ";Extended Properties=dBASE IV")

If Not $oDBConn.State Then Exit 99 + 0 * MsgBox(0 + 48, "Error", "Can't Connect To Database!")

$oDBConn.CursorLocation = 3 ; 1: UseNone, 2: UserServer, 3: UseClient
$oDBRSet.ActiveConnection = $oDBConn
$oDBRSet.CursorType = 3 ; -1: Unspecified, [0]: OpenForwardOnly, 1: OpenKeyse, 2: adOpenDynamic, 3: OpenStatic

$sLikeStr = "%%00000000000"
$oDBRSet.Open('SELECT name, code FROM kladr WHERE code LIKE "' & $sLikeStr & '"') ; Регион
$iRndm = Random(0, $oDBRSet.RecordCount - 1, 1)
$aRows = $oDBRSet.GetRows
$oDBRSet.Close

$aRslt[3][0] = $aRows[$iRndm][0]
$aRslt[3][1] = StringRegExpReplace($aRows[$iRndm][1], "^(\d{2}).*$", "\1")
ConsoleWrite("Регион           > " & $aRslt[3][0] & " | " & $aRslt[3][1] & @CR)

$sLikeStr = $aRslt[3][1] & "%%%00000000"
$oDBRSet.Open('SELECT name, code FROM kladr WHERE code LIKE "' & $sLikeStr & '"') ; Район
$iRndm = Random(0, $oDBRSet.RecordCount - 1, 1)
$aRows = $oDBRSet.GetRows
$oDBRSet.Close

$aRslt[4][0] = $aRows[$iRndm][0]
$aRslt[4][1] = StringRegExpReplace($aRows[$iRndm][1], "^\d{2}(\d{3}).*$", "\1")
ConsoleWrite("Район            > " & $aRslt[4][0] & " | " & $aRslt[4][1] & @CR)

$sLikeStr = $aRslt[3][1] & $aRslt[4][1] & "%%%00000"
$oDBRSet.Open('SELECT name, code FROM kladr WHERE code LIKE "' & $sLikeStr & '"') ; Город
$iRndm = Random(0, $oDBRSet.RecordCount - 1, 1)
$aRows = $oDBRSet.GetRows
$oDBRSet.Close

$aRslt[5][0] = $aRows[$iRndm][0]
$aRslt[5][1] = StringRegExpReplace($aRows[$iRndm][1], "^\d{5}(\d{3}).*$", "\1")
ConsoleWrite("Город            > " & $aRslt[5][0] & " | " & $aRslt[5][1] & @CR)

$sLikeStr = $aRslt[3][1] & $aRslt[4][1] & $aRslt[5][1] & "%%%00"
$oDBRSet.Open('SELECT name, code FROM kladr WHERE code LIKE "' & $sLikeStr & '"') ; Населённый Пункт
$iRndm = Random(0, $oDBRSet.RecordCount - 1, 1)
$aRows = $oDBRSet.GetRows
$oDBRSet.Close

$aRslt[6][0] = $aRows[$iRndm][0]
$aRslt[6][1] = StringRegExpReplace($aRows[$iRndm][1], "^\d{8}(\d{3}).*$", "\1")
ConsoleWrite("Населённый Пункт > " & $aRslt[6][0] & " | " & $aRslt[6][1] & @CR)

_ArrayDisplay($aRslt, "Result")
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
XpycT, очень близко и самое главное генерирует не так долго как у меня это когда-то получалось
Если что, жду продолжения ;D
 

XpycT

Скриптер
Сообщения
380
Репутация
133
pad0nak66
Сейчас столкнулся с проблемой получить
Код:
$array[7] ; улица
$array[8] ; дом
$array[9] ; корпус
$array[10] ; квартира

не всегда находит улицу
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
XpycT, бывает и такое, что в данном населённом пункте нет улицы. Лично я сам такие населённые пункты встречал. Скорей всего это какая либо деревня.
Вот тут, если что, можно сверяться.
 
Верх