powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как отсортировать по улицам
12 сообщений из 12, страница 1 из 1
Как отсортировать по улицам
    #32495648
liana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите с такой ситуацией:
Есть таблица, написанная на FoxPro, состоящая из нескольких полей. Так вот нужно в одном поле отсортировать все данные по алфавиту (по улицам). Вопрос состоит в том, что эти данные расположенны в этом поле так:

г.Иркутск,ул.Чкалова,д.16
Иркутская обл.,п.Городище,ул.Новая,д12,кв.4
Иркутская обл.,г.Иркутск,пр.Победы,д.105,кв.43

Помогите с советом!!!
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32495650
Гост з юха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рэзать нада. вах !
Делаем ПФ, в нее передаем строку из поля, посимвольно перебираем, пока не пройдем "ул.", "пр." и прочие переулки, бульвары, мосты, тупики ))) и рэжым.
Ну а потом
SELECT;
CutUDF(Street),;
Street;
FROM;
STREETS;
ORDER BY 1;
INTO TABLE StreetTmp
Хотя можно и тоньше, но я после вчерашнего ))) пока толсто мыслю.
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32495708
liana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя ли по-подробнее написать, а то я что-то не совсем поняла.
Зараннее спасибо.
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32495789
liana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема заключается и в том, что я незнаю как поместить в отдельные поля город, улицу, дом и квартиру, когда они все набранны в одном поле.
Подскажите, пожалуйста, какой командой это лучше сделать (на фоксе).
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32495796
Фотография Андрей Давыдов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
liana Проблема заключается и в том, что я незнаю как поместить в отдельные поля город, улицу, дом и квартиру, когда они все набранны в одном поле.
Подскажите, пожалуйста, какой командой это лучше сделать (на фоксе).

USE МояТаблица EXCL
ZAP
USE
ERASE МояТаблица.dbf
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32495807
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать примерно так:
("Address" - Ваше исходное поле, "Street" - новое, для сортировки)
Код: plaintext
1.
2.
REPLACE ALL Street WITH ALLTRIM(SUBSTR(Address,AT( "ул." ,Address)+ 3 )) FOR  "ул." $Address
REPLACE ALL Street WITH ALLTRIM(SUBSTR(Address,AT( "пр." ,Address)+ 3 )) FOR  "пр." $Address
...

После этого с полем Street Вы можете делать все, что угодно...
"Гост з юха" советовал то же самое... Только посимвольно перебирать не нужно ;-) Но мы его понимаем, да? :-)))
А вот господин Давыдов из Чебоксар, сегодня не в духе :-( Да еще и норовит другим жизнь подпортить :-(
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32495917
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 liana

Нужно написать свой синтаксический анализатор (т.е. по наличию слова "ул." определять что это именно улица, и т.п.).
Работа это достаточно гемморойная. При небольшом количестве записей вполне возмножно, что перебрать их руками окажется быстрее :)

А алгоритм такой. С помощью функции GetWordNum() перебираешь части адреса между запятыми.
Эта функция появилась в VFP7. В младших версиях нужно подключить библиотеку foxtools.fll
Каждую часть адреса анализируешь на наличие там слов "ул.", "г." и т.п.
И по этому признаку определяешь, что это - город, улица, дом или переулок.

Т.е. примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Scan
For i =  1  to GetWordCount(Address,  "," )

lcAddressPart = GetWordNum(Address, i,  "," )

Do Case
Case  "ул."  $ lcAddressPart
&& Это улица

Case  "г."  $ lcAddressPart
&& Это город

Case  "обл."  $ lcAddressPart
&& Это область

EndCase

EndFor
EndScan
В реальности все будет несколько сложнее. Придется учитывать и порядок слов, и возможность наличия некоторых слов в составе других (например "ул" - "Барнаул")

Ну и под конец, тебе, возможно, придется учесть, что при обычной сортировке "дом 11" встанет аккурат между "дом 1" и "дом 2" ;-)

Удачи :)
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32496145
СергейJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
просто надо тому программисту кто базу создавал настучать по голове! кто-так делает! создал проблему для себя и других!надо справочник делать и подключать! сколько записей в БД! если очень много то есть смысл писать конвертер! если не много!- то вообще надо все переделать по-нормальному.(а скорее всего как я думаю вообще там у вас километр избыточной информации(в смылсе в прог-Е))
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32496302
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: СергейJ

Программист как правило "не при делах" Виноват обычно постановщик задач, который не придвидит дальнейшего развития системы (как, например, в приведенном примере - не было ему сказано, что кто-то захочет получить список, отсортированный по улицам)... Или аналитик...

P.S. Ничего личного и никого не хотел обидеть...
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32496404
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Sergey_Ch
:-))) Однако, программист хоть с малейшим опытом работы должен сам догадаться, что поля стоит разделять + использовать справочники (хотя, конечно, справочники могли быть использованы... только криво - для "составления" полного адресаи впихивания его в одно поле)

To Liana
Отзовитесь!!! Решение нашлось?
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32496554
Vot tak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
че тут гадать а банке видел структыры базы с анкетными данными год рождения.. паспорти идреса.. и все было в MEMO поле с разделителями!!! и, забыли разработчики слэши поставить в одной из дат.. а придумывал я кАК прогрнмть эту базу, чтобы везде недостающие проставить.. и разработчики были - СЕРЬЕЗНАЯ контора из столицы... и банк далеко не последний в стране... вот так-то...
...
Рейтинг: 0 / 0
Как отсортировать по улицам
    #32496556
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда-то пришлось решать подобную задачу. Необходимо было привести адреса из вида "Область,район,город,улица,дом,кв" в вид "Улица дом кв, город, район, область". Нижеприведенная функция это выполняет. Результат работы функции может показаться очень неплохим, но не 100%! Не рекомендую использовать подобные функции для массовой замены. Лучше сделать, чтобы решение о внесении исправления принимал пользователь. Т.е., ответственность о корректности данных должна оставаться за пользователем.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
* ----------------------------------------------------------------------------
 
* Нормализация адреса
* ----------------------------------------------------------------------------
 
Function AdrNorm
lparameters cAddress

local iLenArr1
iLenArr1 =  34                        && массив для склейки лексем
local cArr1[iLenArr1, 2 ]
cArr1[ 01 , 1 ] =  " обл." 
cArr1[ 01 , 2 ] =  "_обл." 
cArr1[ 02 , 1 ] =  " обл" 
cArr1[ 02 , 2 ] =  "_обл" 
cArr1[ 03 , 1 ] =  " область" 
cArr1[ 03 , 2 ] =  "_область" 
cArr1[ 04 , 1 ] =  " р-н" 
cArr1[ 04 , 2 ] =  "_р-н" 
cArr1[ 05 , 1 ] =  " район" 
cArr1[ 05 , 2 ] =  "_район" 
cArr1[ 06 , 1 ] =  "г. " 
cArr1[ 06 , 2 ] =  "г." 
cArr1[ 07 , 1 ] =  "город " 
cArr1[ 07 , 2 ] =  "город_" 
cArr1[ 08 , 1 ] =  "ул " 
cArr1[ 08 , 2 ] =  "ул." 
cArr1[ 09 , 1 ] =  "ул. " 
cArr1[ 09 , 2 ] =  "ул." 
cArr1[ 10 , 1 ] =  "пр. " 
cArr1[ 10 , 2 ] =  "пр." 
cArr1[ 11 , 1 ] =  "пер. " 
cArr1[ 11 , 2 ] =  "пер." 
cArr1[ 12 , 1 ] =  "бр. " 
cArr1[ 12 , 2 ] =  "бр." 
cArr1[ 13 , 1 ] =  "б-р " 
cArr1[ 13 , 2 ] =  "б-р_" 
cArr1[ 14 , 1 ] =  "бульв. " 
cArr1[ 14 , 2 ] =  "бульв." 
cArr1[ 15 , 1 ] =  "бульвар " 
cArr1[ 15 , 2 ] =  "бульвар_" 
cArr1[ 16 , 1 ] =  "п-т " 
cArr1[ 16 , 2 ] =  "п-т_" 
cArr1[ 17 , 1 ] =  "пр-т " 
cArr1[ 17 , 2 ] =  "пр-т_" 
cArr1[ 18 , 1 ] =  "просп. " 
cArr1[ 18 , 2 ] =  "просп." 
cArr1[ 19 , 1 ] =  "пл. " 
cArr1[ 19 , 2 ] =  "пл." 
cArr1[ 20 , 1 ] =  " спуск" 
cArr1[ 20 , 2 ] =  "_спуск" 
cArr1[ 21 , 1 ] =  " шоссе" 
cArr1[ 21 , 2 ] =  "_шоссе" 
cArr1[ 22 , 1 ] =  " наб." 
cArr1[ 22 , 2 ] =  "_наб." 
cArr1[ 23 , 1 ] =  " набережная" 
cArr1[ 23 , 2 ] =  "_набережная" 
cArr1[ 24 , 1 ] =  "д. " 
cArr1[ 24 , 2 ] =  "д." 
cArr1[ 25 , 1 ] =  "кв. " 
cArr1[ 25 , 2 ] =  "кв." 
cArr1[ 26 , 1 ] =  "корп. " 
cArr1[ 26 , 2 ] =  "корп." 
local iSelo
iSelo =  27 
cArr1[ 27 , 1 ] =  "хутор " 
cArr1[ 27 , 2 ] =  "хутор_" 
cArr1[ 28 , 1 ] =  "дер. " 
cArr1[ 28 , 2 ] =  "дер." 
cArr1[ 29 , 1 ] =  "деревня " 
cArr1[ 29 , 2 ] =  "деревня_" 
cArr1[ 30 , 1 ] =  "c. " 
cArr1[ 30 , 2 ] =  "с." 
cArr1[ 31 , 1 ] =  "село " 
cArr1[ 31 , 2 ] =  "село_" 
cArr1[ 32 , 1 ] =  "пос. " 
cArr1[ 32 , 2 ] =  "пос." 
cArr1[ 33 , 1 ] =  "поселок " 
cArr1[ 33 , 2 ] =  "поселок_" 
cArr1[ 34 , 1 ] =  "пгт " 
cArr1[ 34 , 2 ] =  "пгт_" 

iLenArr2 =  17                   && массив для определения  "улицы" 
local cArr2[iLenArr2]
cArr2[ 01 ] =  "улица" 
cArr2[ 02 ] =  "ул." 
cArr2[ 03 ] =  "переулок" 
cArr2[ 04 ] =  "пер." 
cArr2[ 05 ] =  "проспект" 
cArr2[ 06 ] =  "п-т" 
cArr2[ 07 ] =  "пр-т" 
cArr2[ 08 ] =  "просп." 
cArr2[ 09 ] =  "пр." 
cArr2[ 10 ] =  "площадь" 
cArr2[ 11 ] =  "пл." 
cArr2[ 12 ] =  "бульвар" 
cArr2[ 13 ] =  "бр." 
cArr2[ 14 ] =  "б-р" 
cArr2[ 15 ] =  "бульв." 
cArr2[ 16 ] =  "_спуск" 
cArr2[ 17 ] =  "_шоссе" 

&& склейка лексем
cAddress = onespace(chrtran(alltrim(cAddress),',',' '))
local i
for i= 1  to iLenArr1
   cAddress = strtran(cAddress, cArr1[i, 1 ], cArr1[i, 2 ])
endfor
cAddress = onespace(cAddress)

&& поиск лексемы  "улица" 
local iSeek
iSeek =  0 
for i= 1  to iLenArr2
   iSeek = at(cArr2,cAddress)
   if iSeek> 0 
      exit
   endif
endfor
if iSeek> 0  and substr(cAddress,iSeek, 1 )=='_'
   do while iSeek> 0  and !substr(cAddress,iSeek, 1 )==' '
      iSeek = iSeek -  1 
   enddo
endif
if iSeek= 0  and ( "р-н" $cAddress or  "район" $cAddress)
   i = iSelo
   do while iSeek= 0  and i<=iLenArr1
      iSeek = at(cArr1[i, 2 ],cAddress)
      i = i +  1 
   enddo
endif

local iAt, iRat, cWord, cAddress2
do case
case iSeek= 1 
   && адрес уже нормализован
case iSeek> 1 
   &&  "улица"  найдена
   cAddress2 = alltrim(substr(cAddress,iSeek))
   cAddress = rtrim(left(cAddress,iSeek- 1 ))
   if left(cAddress, 1 )<>' '
      cAddress = ' '+cAddress
   endif
   do while !empty(cAddress)
      iRat = rat(' ',cAddress)
      cWord = iif(iRat> 0 , substr(cAddress,iRat+ 1 ), '')
      cAddress2 = cAddress2+', '+cWord
      cAddress = left(cAddress,iRat- 1 )
   enddo
   cAddress = onespace(chrtran(cAddress2,'_',' '))
otherwise
   &&  "улица"  не найдена
   iAt = at(' ',cAddress)
   cWord = left(cAddress,iAt- 1 )
   do case
   case iAt= 0 
       && первое слово не найдено
   case ischars(cWord, "0123456789 ")
      && первое слово индекс => первые два слова в конец
      iSeek = at(' ',cAddress, 2 )
      cAddress2 = alltrim(substr(cAddress,iSeek))
      cAddress = rtrim(left(cAddress,iSeek- 1 ))
      if left(cAddress, 1 )<>' '
         cAddress = ' '+cAddress
      endif
      do while !empty(cAddress)
         iRat = rat(' ',cAddress)
         cWord = iif(iRat> 0 , substr(cAddress,iRat+ 1 ), '')
         cAddress2 = cAddress2+', '+cWord
         cAddress = left(cAddress,iRat- 1 )
      enddo
      cAddress = cAddress2
   otherwise
      && первое слово не индекс => первое слово - в конец
      cAddress = substr(cAddress,iAt)+' '+cWord
   endcase
   cAddress = onespace(chrtran(cAddress,'_',' '))
endcase

return cAddress

* [i]----------------------------------------------------------------------------
 
* Удаление избыточных пробелов
* ----------------------------------------------------------------------------
 
Function onespace
lparameters cStr
local i, lFlag, cRes, cChar

cRes = ""
lFlag = .t.
for i= 1  to len(cStr)
   cChar = substr(cStr,i, 1 )
   if !cChar==' ' or !lFlag
      cRes = cRes + cChar
   endif
   lFlag = cChar==' '
endfor

return rtrim(cRes)

* -----------------------------------------------------------------------------
 
* Проверяет, состоит ли строка только из указанного набора символов
* -----------------------------------------------------------------------------
 
Function ischars
lparameters cStr, cChars
local i, lRes

lRes = .t.
for i= 1  to len(cStr)
   if !substr(cStr,i, 1 ) $ cChars
      lRes = .f.
      exit
   endif
endfor

return lRes
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как отсортировать по улицам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]