Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 парсинг адреса КЛАДР  [new]
Петр
Member

Откуда: Москва
Сообщений: 793
здравствуйте,
поделитесь если не жаль кодом парсинга адреса КЛАДРа. т.е. разбиения всех номеров домов
Н(1-15),Ч(16-38),58,62,66,70,74,Ч(80-84)
построчно...
9 апр 09, 12:30    [7043916]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Вспомнилось...
9 апр 09, 12:55    [7044096]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
Петр
Member

Откуда: Москва
Сообщений: 793
спасибо за ссылку. правда работает только непосредственно с диапазонами... буду дорабатывать...

может есть у кого более полный вариант?
9 апр 09, 13:30    [7044381]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SQL2005/2008
DECLARE @S VARCHAR(MAX)='Н(1-15),58,Ч(16-38),62,43-49,66,70,74,Ч(80-84)';
WITH
 Part(S) AS
 (
  SELECT LTRIM(SUBSTRING(@S,V1.number, MIN(V2.number)-V1.number))
  FROM master.dbo.spt_values V1 JOIN master.dbo.spt_values V2
  ON V1.type='P' AND V2.type='P' AND SUBSTRING(','+@S,V1.number,1)=',' AND SUBSTRING(@S+',',V2.number,1)=',' AND V1.number<V2.number
  GROUP BY V1.number
 )
,Range(Step,Start,Finish) AS
 (
  SELECT
   CASE WHEN S LIKE '[НЧ]%' THEN 2 WHEN S LIKE '%-%' THEN 1 ELSE 0 END,
   CAST(SUBSTRING(S, PATINDEX('%[0-9]%',S), CHARINDEX('-',S+'-')-PATINDEX('%[0-9]%',S)) AS INT),
   CAST(ISNULL(SUBSTRING(S, NULLIF(CHARINDEX('-',S),0)+1, PATINDEX('%[0-9][^0-9-]%',S+')')-CHARINDEX('-',S)),S) AS INT)
  FROM Part
 )
,List(N,Step,Finish) AS
(
 SELECT Start, Step, Finish FROM Range
 UNION ALL
 SELECT N+Step, Step, Finish FROM List WHERE N<Finish
)
SELECT DISTINCT N FROM List ORDER BY N OPTION(MAXRECURSION 0);
9 апр 09, 15:31    [7045365]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
Петр
Member

Откуда: Москва
Сообщений: 793
вроде сделал...
кому интересно выкладываю код учитывающий максимально возможные варианты записи адреса
create table dbo.address(counter int identity(1, 1) ,CODE varchar(19), OCATD varchar(11), Building varchar(50), Corpus varchar(50), Construction varchar(50))
go

create procedure dbo.usp_get_range_number(@address varchar(4000), @CODE varchar(19), @OCATD varchar(11)) 
AS
declare @SQL varchar(4000);
if object_id('tempdb..##numbers') is null
begin
create table ##numbers(counter int)
declare @count int
set @count = 1
while @count < 5000 
	begin
		insert into ##numbers values(@count)
		set @count = @count + 1
	end
end

set @SQL='select Building = counter, Corpus = convert(varchar(50), null), Construction = convert(varchar(50), null), CODE = ''' + @CODE + ''', OCATD = ''' + @OCATD + ''' FROM ##numbers where '+replace(replace(replace(replace(replace(replace(@address,'(',' between '),'-',' and '),',',' or '),')',''),'Н', ' counter '+'%2=1 and'+' counter '),'Ч', ' counter '+'%2=0 and'+' counter ');
if charindex('between', @SQL) = 0 
	set @SQL = replace(@SQL, 'where', 'where counter between ')
exec(@SQL)
go

create procedure dbo.usp_set_build_parsing(@address varchar(4000), @CODE varchar(19), @OCATD varchar(11)) 
AS
declare @build varchar(50), @comma int,
		@Corpus_index int, @Construction_index int, @Building varchar(50), @Corpus varchar(50), @Construction varchar(50),
		@Corpus_index_end int

set @address=ltrim(rtrim(@address))

while len(@address) > 0
begin
	set @build = ''
	set @Building = null
	set @Corpus = null
	set @Construction = null

	set @comma = charindex(',', @address)	
	if @comma <> 0 
		set @build = substring(@address, 1, @comma - 1)
	else
	begin
		set @build = @address 
		set @address = ''	
	end
	  set @address = substring(@address, @comma + 1, 3000)	

	-- дианазоны (четные/нечетные) номера зданий
	if charindex('-', @build) <> 0
	begin 
		if len(@build) > 1 -- Исключаються варианты 37/2,Ч
			insert into address(Building, Corpus, Construction, CODE, OCATD)
			exec dbo.usp_get_range_number @build, @CODE, @OCATD
	end
	else
	begin

	 -- корпус зданий
	 set @Corpus_index = charindex('к', @build)	
	 set @Construction_index = charindex('стр', @build)

	 if @Construction_index = 0 set @Corpus_index_end = 4000 else set @Corpus_index_end = @Construction_index - 1

	 if @Corpus_index <> 0 
	 begin
		set @Building = substring(@build, 1, @Corpus_index - 1)
		set @Corpus = substring(@build, @Corpus_index + 1, @Corpus_index_end - @Corpus_index)
	 end

	 -- строение зданий
	 if @Construction_index <> 0 
	 begin
		if isnull(@Building, '') = '' set @Building = substring(@build, 1, @Construction_index - 1)
		set @Construction = substring(@build, @Construction_index + 3, 4000)
	 end

	 if isnull(@Building, '') = '' set @Building = @build

	 insert into address(Building, Corpus, Construction, CODE, OCATD)
	 select @Building, @Corpus, @Construction, @CODE, @OCATD
	end -- без 'Ч', 'Н'
end
go

truncate table address

exec dbo.usp_set_build_parsing N'1/26к1,1/26к1стр1,1/26к2,1/26к3,2/24,3', N'2200000100004330004', N'01401363001'
exec dbo.usp_set_build_parsing N'Ч(8-12),1-7,11', N'2200000100004330003', N'01401363000'

select * from address
drop table ##numbers
10 апр 09, 14:45    [7050350]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
bug_scorobey
Member

Откуда: Москва
Сообщений: 127
Петр,

.

господа если есть вопросы по КЛАДР и адреса пишите отвечу на все вопросы
для того как и что может работать зацените www.post-address.ru
16 апр 09, 12:50    [7072820]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
TanyaRRR
Guest
Коллеги, день добрый!

Может у кого найдется алгоритм, как распарсить в файле "KLADR" субъекты в структуры: область, район, город/нас пункт. Взаимосвязь отражается в CODE, но не могу найти расшифровку CODE посимвольно.
20 ноя 09, 11:52    [7955468]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
Петр
Member

Откуда: Москва
Сообщений: 793
описание

К сообщению приложен файл (doc.RAR - 68Kb) cкачать
14 дек 09, 13:15    [8063167]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
TanyaRRR
Может у кого найдется алгоритм, как распарсить в файле "KLADR" субъекты в структуры: область, район, город/нас пункт.
Не надо субъекты раскидывать по разным таблицам, имхо. Одно дерево - самое то. Я объединял KLADR.DBF и STREET.DBF в одну таблицу. Гораздо удобнее нескольких.
14 дек 09, 13:42    [8063322]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: парсинг адреса КЛАДР  [new]
Alex_496
Member [заблокирован]

Откуда: https://www.dvbi.ru
Сообщений: 3869
макросом на Excele распарсить сможет даже финик
12 сен 11, 18:19    [11265781]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
svi0105
Member

Откуда:
Сообщений: 3
Господа, а не подскажет ли кто, как трактовать использование "литер", если после него отсутствует значение:
37к2литер,45,47,80к1литер,80к2литер

Здесь, например, все понятно:
92к1литерА,92литерА,98
А в первом случае? В доках КЛАДРа по этому поводу ничего нет..
15 мар 12, 17:03    [12255433]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: парсинг адреса КЛАДР  [new]
EV.P
Member

Откуда:
Сообщений: 134
svi0105,

Непонятно..... Вообще есть у кого-нибудь хранимка для разворота в таблицу номеров домов?
21 май 14, 15:38    [16049569]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1253
Мой вам совет, забейте, возьмите ФИАС, там все на отдельные дома разложено. Да и тема по заливке ФИАС в MSSQL от меня была где-то недавно.
22 май 14, 09:02    [16052456]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
EV.P
Member

Откуда:
Сообщений: 134
энди,

Нашёл Вашу тему по загрузке ФИАС. Данная тема так и не решена (дубляж домов, а почтовые индексы у них разные).
Например, Московская обл, Ступино г, Андропова ул.
Что же делать-то?
И таких дубляжей там полно! Эх...
22 май 14, 14:10    [16055076]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1253
читайте внимательнее тему в базе все верно, человек просто немного неверно написал запрос, с моим текстом запроса никаких дублей нет
22 май 14, 17:31    [16057033]     Ответить | Цитировать Сообщить модератору
 Re: парсинг адреса КЛАДР  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1253
вот запрос для улицы Андропова в Ступино

SELECT * FROM Houses
WHERE AOGUID='7542779a-a6d2-4344-ba5d-b30eb76342cf'
AND GETDATE() BETWEEN STARTDATE AND ENDDATE
ORDER BY HOUSENUM

что-то я в списке никаких дублей не вижу, так что простите, но будьте пожалуйста несколько внимательнее прежде чем кидаться подобными утверждениями
22 май 14, 17:41    [16057101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить