:: Visual Foxpro, Foxpro for DOS
замена по условию в символьном поле
ivcou
Автор

Сообщений: 3
Дата регистрации: 07.04.2011
Есть таблица, одно поле, 999 записей, по 8 символов.
1. считать первую запись, вырезать из поля 3 первые символа слева и заменить ими текущее значение.
2. перейти на вторую запись, проверить, если первые 3 символа слева уникальны во всей таблице то заменить ими текущее значение поля, если не уникально, то считать на 1 символ больше (считать из поля 4 первые символа слева и заменить ими текущее значение).
3. перейти на третью запись , проверить, если первые 3 символа слева уникальны во всей таблице то заменить ими текущее значение поля, если не уникально, то считать на 1 символ больше, если и это значение не уникально то считать из поля на 1 символ больше и заменить ими текущее значение).
Нужно заменить значения по всем 999 записям таблицы.

Например, было:
Бааххххх
Баблхххх
Бабохххх
Баборххх
Баборчхх
Бавххххх
Бавкхххх
Бавыхххх
Багххххх

должно получиться:
Баа
Бабл
Бабо
Бабор
Баборч
Бав
Бавк
Бавы
Баг

Помогите пожалуйста, если это возможно.



Исправлено 1 раз(а). Последнее : ivcou, 07.04.11 23:07
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
krot_u

Сообщений: 1760
Откуда: Екатеринбург
Дата регистрации: 18.08.2005
Например
? STRTRAN('Бааххххх', 'х', '')
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
1793

Сообщений: 290
Откуда: Озерск
Дата регистрации: 17.10.2001
чё то типа
доработать рашпилем
Close Databases All
Use таблица
Go Top
Replace поле With Left(поле,3)
skip
Do WHILE !Eof()
For i=3 To 8
x=Left(поле,i)
Select Cnt(*) From таблица Where Left(поле,i)=x Into Array aTmp
If aTmp(1)=1
Replace поле With x
Endif
Endfor
Skip
Enddo
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
pioner-v

Сообщений: 1656
Дата регистрации: 01.05.2010
ivcou
Есть таблица, одно поле, 999 записей, по 8 символов.
...

Ручками в Browse. 999 записей - это на час работы(с размышлениями и перерывом на чай .
Это если разовая операция.
Если это надо делать "регулярно", то используйте цикл, а в нем указанный Вами алгоритм.
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Владимир Максимов

Сообщений: 14086
Откуда: Москва
Дата регистрации: 02.09.2000
Отсортируйте таблицу по указанному полю (постройте индекс). Тогда вопрос поиска "дублей" - это просто сравнение текущей и последующей записей. Т.е. двух соседних записей.
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Цитата:
skip
Do WHILE !Eof()
Что за инновации? SCAN .. ENDSCAN.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Igor VS

Сообщений: 2193
Откуда: Харьков
Дата регистрации: 26.01.2011
Владимир Максимов
Отсортируйте таблицу по указанному полю (постройте индекс). Тогда вопрос поиска "дублей" - это просто сравнение текущей и последующей записей. Т.е. двух соседних записей.

Тогда следующим вопросом будет "почему замена происходит только в одной записи"


------------------
Трехколесный пароход
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Владимир Максимов
Отсортируйте таблицу по указанному полю (постройте индекс). Тогда вопрос поиска "дублей" - это просто сравнение текущей и последующей записей. Т.е. двух соседних записей.

Отсортировать в порядке убывания. И алгоритм автора сделать немного более универсальным - начинать со второго пункта, а первый удалить.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено 1 раз(а). Последнее : Влад Колосов, 08.04.11 12:25
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
1793

Сообщений: 290
Откуда: Озерск
Дата регистрации: 17.10.2001
Влад Колосов
Цитата:
skip
Do WHILE !Eof()
Что за инновации? SCAN .. ENDSCAN.
дык
Цитата:
1. считать первую запись,...
2. перейти на вторую запись...
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Скипы просто медленно работают... можно выбрать значение ключа первого элемента и сделать
scan for id <> first_id
endscan


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
1793

Сообщений: 290
Откуда: Озерск
Дата регистрации: 17.10.2001
Влад Колосов
Скипы просто медленно работают... можно выбрать значение ключа первого элемента и сделать
scan for id <> first_id
endscan
я просто тупо перевел что хотел вопрошающий (практически дословно, ну от себя еще добавил for)
про скорость в вопросе ничего не было



Исправлено 1 раз(а). Последнее : 1793, 08.04.11 12:37
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
akvvohinc

Сообщений: 4150
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
scan for id <> first_id
SCAN REST && стоя на 2 записи
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Да вот нет уверенности, что скан использует порядок сортировки по индексу, а не физический...


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
Igor VS

Сообщений: 2193
Откуда: Харьков
Дата регистрации: 26.01.2011
Влад Колосов
Да вот нет уверенности, что скан использует порядок сортировки по индексу, а не физический...

Есть уверенность.
Мало того - если изменить значение поля, входящего в ключ активного индекса, так чтобы модифицированный ключ стал последним, то скан на этом и закончится.


------------------
Трехколесный пароход




Исправлено 1 раз(а). Последнее : Igor VS, 08.04.11 18:22
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
ivcou
Автор

Сообщений: 3
Дата регистрации: 07.04.2011
Большое спасибо 1793!

Забыл сказать, список в базе уже сгруппирован, дублей там нет (но они могут появиться в процессе замены).
Работает, но немного не так как нужно. Может ошибся в описании условий?
замена :замена
програм.:руками

Баа :Баа
Бабад :Баб (не убраны 2 лишних символа)
Бабал :Баба (не убран 1 символ)
Бабан :Бабан
Бабар :Бабар
Бабаш :Бабаш
Бабен :Бабе (1 лишний символ)
Бабеш :Бабеш
Бабил :Баби (1 лишний символ)
Бабин :Бабин
Бабич :Бабич
Бабл :Бабл
Бабо :Бабо
Бабр :Бабр
Бабул :Бабу (1 лишний символ)
Бабуц :Бабуц
Бабч :Бабч
Бабы :Бабы
Бава :Бав (1 лишний символ)
Бавк :Бавк
Бавы :Бавы
Багам :Баг (2 лишних символа)



Исправлено 1 раз(а). Последнее : ivcou, 09.04.11 17:28
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
akvvohinc

Сообщений: 4150
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Может ошибся в описании условий?
Несомненно.
Например, во второй записи про желаемое вами "Баб" нельзя сказать, что оно удовлетворяет вашему 2 условию:
Цитата:
2. перейти на вторую запись, проверить, если первые 3 символа слева уникальны во всей таблице...

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

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

Или проверять во всех записях, но не 3 символа, а все 8 (после замены в текущей). Тогда:
Баб_____ не будет совпадать с Бабохххх и другими Баб.....

Кроме того, вы сами в своем первом примере для 2-й строки почему-то написали "Бабл", а не "Баб", как следует из вашего второго примера.

А добиться того, чтобы ваш второй пример сработал можно заменой двух строк в программе:
Select Cnt(*) From таблица Where поле=PADR(x,LEN(поле)) Into Array aTmp
If aTmp(1)=0

PS
Да и цикл имеет смысл только до предпоследнего (7-го в вашем случае) символа.



Исправлено 1 раз(а). Последнее : akvvohinc, 09.04.11 06:31
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
1793

Сообщений: 290
Откуда: Озерск
Дата регистрации: 17.10.2001
ivcou
Работает, но немного не так как нужно. Может ошибся в описании условий?
комп НИКОГДА не ошибается (ну если рабочий)
если Работает, но немного не так как нужно - ошибся в описании условий
проверяется элементарно - тупо идем на
2 запись Бабад :Баб
и проверяем почему не убраны 2 лишних символа
уточняем условия
Ratings: 0 negative/0 positive
Re: замена по условию в символьном поле
ivcou
Автор

Сообщений: 3
Дата регистрации: 07.04.2011
Да, ошибся в условии, извиняюсь.

Большое спасибо akvvohinc.
Теперь все работает как нужно.
Еще и свои 4 ошибки ручной замены нашел, сравнивая результаты.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика