|
|
|
Удаление дублей
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуйста решить следующую проблему средствами Fox Pro 2.6. У меня имеется таблица (скажем, spis-fed.dbf). Мне необходимо найти в ней все записи, которые дублируются по трем полям и удалить все дубли. При этом дубли могут встретиться не друг за другом, а "на протяжении" всего файла. Например: Иванов Иван Иванович 40 Петров Петр Петрович 50 Иванов Иван Иванович 80. У меня есть prg-шник, который удаляет дубли, идущие друг за другом. Код: ********************************************************** ** ПОИСК ЗАПИСЕЙ-ДУБЛЕЙ В ФАЙЛЕ set talk on set date to german im_f="spis-fed.dbf" define window file_name from 4,23 to 10,55 color W/B activate window file_name @ 0,3 say "УДАЛЕНИЕ ДУБЛЕЙ" @ 2,5 say "Введите имя файла" @ 4,7 get im_f read release window file_name use sys(2003)+"\"+im_f goto top count1=0 do while .not. eof() store recno() to rec1 goto rec1 f1=eval(field(2)) && ПО ФАМИЛИИ ! ПЕРВАЯ ЗАПИСЬ i1=eval(field(3)) && ПО ИМЕНИ ! o1=eval(field(4)) && ПО ОТЧЕСТВУ ! skip rec2=rec1+1 f2=eval(field(2)) && ПО ФАМИЛИИ ! ВТОРАЯ ЗАПИСЬ i2=eval(field(3)) && ПО ИМЕНИ ! o2=eval(field(4)) && ПО ОТЧЕСТВУ ! * СРАВНИВАЕМ ЗАПИСИ ПО ПОЛЯМ: if f1=f2 .and. i1=i2 .and. o1=o2 delete record rec2 && удаляем вторую запись-дубль count1=count1+1 endif ** enddo pack WAIT WINDOW 'ВСЕГО УДАЛЕНО '+alltrim(str(count1))+' ДУБЛЕЙ' release all close all quit ********************************************************** Как сделать двойной цикл, чтобы первая запись по порядку сравнивалась со всеми остальными и они удалялись, затем вторая и т.д. ло конца файла? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 22:01 |
|
||
|
Удаление дублей
|
|||
|---|---|---|---|
|
#18+
Если сумма длин всех 3 полей не превышает 120 символов и не имеет значения, какую из повторяющихся записей оставить, то можно это решить через индекс типа UNIQUE Код: plaintext 1. 2. 3. 4. 5. Идея в том, что индекс типа UNIQUE позволяет таблице иметь повторяющиеся значения, но отображает только уникальные (первые попавшиеся) Если есть принципиальная разница, какую из повторяющихся записей удалять, то можно просто создать нужный индекс, чтобы сканрование записей шло в строго определенном порядке и возможные дубли следовали друг за другом. Код: plaintext 1. 2. 3. 4. 5. если же по каким-либо причинам создание временного индекса абсолютно невозможно, то остается делать выборку во временную таблицу Код: plaintext 1. 2. 3. 4. 5. Далее сканируешь результат этой выборки, ищешь все дубли в исходной таблице (LOCATE FOR ... + CONTINUE) и удаляешь их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 22:28 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=274&tid=1592353]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 304ms |

| 0 / 0 |
