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

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

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

USE МояТаблица EXCL
ZAP
USE
ERASE МояТаблица.dbf
...
Рейтинг: 0 / 0
25.04.2004, 17:57
    #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
25.04.2004, 23:01
    #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
26.04.2004, 09:50
    #32496145
СергейJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсортировать по улицам
просто надо тому программисту кто базу создавал настучать по голове! кто-так делает! создал проблему для себя и других!надо справочник делать и подключать! сколько записей в БД! если очень много то есть смысл писать конвертер! если не много!- то вообще надо все переделать по-нормальному.(а скорее всего как я думаю вообще там у вас километр избыточной информации(в смылсе в прог-Е))
...
Рейтинг: 0 / 0
26.04.2004, 11:06
    #32496302
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсортировать по улицам
To: СергейJ

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

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

To Liana
Отзовитесь!!! Решение нашлось?
...
Рейтинг: 0 / 0
26.04.2004, 12:30
    #32496554
Vot tak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсортировать по улицам
че тут гадать а банке видел структыры базы с анкетными данными год рождения.. паспорти идреса.. и все было в MEMO поле с разделителями!!! и, забыли разработчики слэши поставить в одной из дат.. а придумывал я кАК прогрнмть эту базу, чтобы везде недостающие проставить.. и разработчики были - СЕРЬЕЗНАЯ контора из столицы... и банк далеко не последний в стране... вот так-то...
...
Рейтинг: 0 / 0
26.04.2004, 12:31
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как отсортировать по улицам / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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