Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
1

Есть 10 тыс. ссылок, которые надо сверить с 40 тыс. ссылок и удалить совпадающие

28.03.2017, 19:34. Показов 922. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Давно читал турниры из Базы вопросов http://db.chgk.info, копировал в ворд некоторые вопросы для перечитки. Из 40 000 вопросов скопировал 10 000 вопросов.
Сейчас смотрю, можно было и тщательней копировать, то есть надо перечитывать, но часть уже есть.
Надо убрать из всех турниров скопированные вопросы.

Документ “10” – вордовский файл с 10 000 скопированными вопросами (точнее, 31 документ по 100 страниц)
Документ “40 all” – вордовский файл с 40 000 вопросами, которые надо перечитать (75 документов по 200 страниц). Из этих 40 000 уже скопированы 10 000, их и надо убрать, чтобы не перечитывать. Это html-страницы, которые открываю через ворд.

У вопросов есть уникальные ссылки http://db.chgk.info/question/gamb14l.1/1 (есть слово question). Может быть еще “person”, “tour” http://db.chgk.info/person/vkrivolapov или http://db.chgk.info/tour/gamb14l/print, но интересуют только вопросы.

Подробности внутри файла “Скрипт”, файлы “10” и “Онлайн – турнир” для проверки.

Спасибо.
Вложения
Тип файла: docx скрипт.docx (50.5 Кб, 6 просмотров)
Тип файла: docx Онлайн-турнир _example Гамбургский счет_ - 2013_14. Лето.docx (95.7 Кб, 7 просмотров)
Тип файла: docx 10 example.docx (4.2 Кб, 6 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2017, 19:34
Ответы с готовыми решениями:

Есть ли такая биржа ссылок, где можно размещать место для ссылок вне видимости страницы сайта
Например сдвинуть абсолютом размещаемые на сайте ссылки, вверх, вниз, вправо или влево?

Нужна сборка системника в пределах 20 тыс. (плюс минус 2-3 тыс.)
Нужен игровой системник в районе 20 тыс. Покупать буду на www.ulmart.ru. Нужна полная комплектация...

Максимальная производительность за 15 тыс рублей или 5 тыс грн
Здравствуйте!оцените пожалуйста сборку. ПК для игр и обработки видео.Бюджет 5 тыс грн. Хочется...

Сборка за 25 тыс. грн. / 900$ / 62 тыс. рублей
Здравствуйте! Нужна сборка для игр и стримов, в основном на стриме и записи видео будет World of...

19
Динохромный
1400 / 763 / 284
Регистрация: 22.12.2015
Сообщений: 2,387
29.03.2017, 10:46 2
durol, очень много информации, и очень лаконично описано, что вы хотите сделать.
Надо в отельный файл скопировать только ссылки без текста [...] переделать ссылки в
Решается одним кодом VBA:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Sub HypLinks_copy()
    Dim DataDoc As Document, TargetDoc As Document
    Dim HLobj As Hyperlink
    Set DataDoc = Application.ActiveDocument
    Set TargetDoc = Application.Documents.Add
    TargetDoc.Activate
    For Each HLobj In DataDoc.Hyperlinks
        If HLobj.Address Like "*db.chgk.info/question*" Then
            
            TargetDoc.Hyperlinks.Add Anchor:=Selection.Range, Address:=HLobj.Address, TextToDisplay:=HLobj.Address
            Selection.TypeParagraph
            
        End If
    Next HLobj
    Set DataDoc = Nothing
    Set TargetDoc = Nothing
    
End Sub
Задачу по преобразованию текста гиперссылок типа "Вопрос Х" в адрес ссылки, поиск, удалению и возвращению в исходное состояние я свел к коду VBA со следующими оговорками:
1. В коде указаны имена файлов включая расширение, которые вы должны заменить на реальные.
2. Код перебирает все гиперссылки, содержащие "*db.chgk.info/question*" и ищет их во втором файле, если находит - удаляет гиперссылку в первом файле и найденное вхождение во втором (если существуют другие вхождения, код их не ищет). Текст вопроса также не удаляется.
3. Код можно откорректировать, если вы дадите внятный алгоритм его работы.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Sub HypLinks_audit()
    Dim DataDoc As Document, TargetDoc As Document
    Dim HLobj As Hyperlink, HL2obj As Hyperlink
    
    Set DataDoc = Application.Documents.Item("10.docm")
    Set TargetDoc = Application.Documents.Item("40 all.docm")
    
    
    For Each HLobj In DataDoc.Hyperlinks
        If HLobj.Address Like "*db.chgk.info/question*" Then
            For Each HL2obj In TargetDoc.Hyperlinks
                If HLobj.Address = HL2obj.Address Then
                    HLobj.Range.Delete
                    HL2obj.Range.Delete
                    Exit For
                End If
            Next
        End If
    Next HLobj
    Set DataDoc = Nothing
    Set TargetDoc = Nothing
    
End Sub
Полагаю, сейчас будут обнародованы уточненные требования к работе кода, желательно сформулировать их по существу и без ссылок на ресурс db.chgk.info.

Не по теме:

Попадает ли ваш пост с отсылкой на сайт db.chgk.info под раскрутку данного ресурса и таким образом под п.5.7. ПФ это вопрос модераторов, но лично мне неудобно копаться в большом объеме разнообразных данных без сформулированной задачи (проблему вы в принципе описали, а вот чего код в результате должен сделать - т.е. постановка задачи - мне не понятно).

1
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 12:26 3
ваша задача --явно не для WORD
в ворде --это только свалка мусора

один из вариантов --перевести в ексель/аксесс, чтобы было возможно
--поиск
--фильтр
--пометки
--выборочная распечатка

пример в екселе немного не так сделан --надо сделать в формате вопрос=строка
Миниатюры
Есть 10 тыс. ссылок, которые надо сверить с 40 тыс. ссылок и удалить совпадающие  
Вложения
Тип файла: zip скрипт0328.zip (323.6 Кб, 2 просмотров)
1
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
29.03.2017, 14:28  [ТС] 4
При сверке 10 и 40 all убирается только половина из всех подходящих ссылок. Если еще раз запустить – еще половина удалится и т.д. 30 ссылок правильно убралось с 6 запуска. Проверил на 2 документах, оба раз каждый запуск убирал половину нужных ссылок.
0
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 14:56 5
не знаю, почему удаление идет из двух документов ---но удаление всегда делают с хвоста
Visual Basic
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
Public Sub HypLinks_audit()
    Dim DataDoc As Document, TargetDoc As Document
    Dim HLobj As Hyperlink, HL2obj As Hyperlink
    Dim j1, j2, spath
    spath = Word.ActiveDocument.Path & ""
    Set DataDoc = Application.Documents.Item(spath & "10.docx")
    Set TargetDoc = Application.Documents.Item(spath & "40.docx")
    
    j1 = DataDoc.Hyperlinks.Count
    Debug.Print j1, DataDoc.Name
    
    Do While j1 > 0
    Set HLobj = DataDoc.Hyperlinks(j1)
    
        If HLobj.Address Like "*db.chgk.info/question*" Then
        Debug.Print j1, HLobj.Address
        
        j2 = TargetDoc.Hyperlinks.Count
        Debug.Print j2, TargetDoc.Name
            Do While j2 > 0
            Set HL2obj = TargetDoc.Hyperlinks(j2)
                If HLobj.Address = HL2obj.Address Then
                 Debug.Print j1, j2, HLobj.Address
                    HLobj.Range.Delete
                    HL2obj.Range.Delete
                   
                    Exit Do
                End If
            j2 = j2 - 1
            Loop
        End If
    j1 = j1 - 1
    Loop
    Set DataDoc = Nothing
    Set TargetDoc = Nothing
    
End Sub
1
Динохромный
1400 / 763 / 284
Регистрация: 22.12.2015
Сообщений: 2,387
29.03.2017, 14:59 6
Цитата Сообщение от durol Посмотреть сообщение
убирается только половина из всех подходящих ссылок
Странно, на примере вроде сработало, впрочем сомненья были.
Попробуйте такой код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Sub HypLinks_audit_index()
    Dim DataDoc As Document, TargetDoc As Document
    Dim i As Long, j As Long, n1 As Long
    
    Set DataDoc = Application.Documents.Item("10.docm")
    Set TargetDoc = Application.Documents.Item("40 all.docm")
    n1 = DataDoc.Hyperlinks.Count
    
    For i = n1 To 1 Step -1
        If DataDoc.Hyperlinks.Item(i).Address Like "*db.chgk.info/question*" Then
            For j = TargetDoc.Hyperlinks.Count To 1 Step -1
                If DataDoc.Hyperlinks.Item(i).Address = TargetDoc.Hyperlinks.Item(j).Address Then
                    DataDoc.Hyperlinks.Item(i).Range.Delete
                    TargetDoc.Hyperlinks.Item(j).Range.Delete
                    Exit For
                End If
            Next j
        End If
    Next i
    
    Set DataDoc = Nothing
    Set TargetDoc = Nothing
    
End Sub
Добавлено через 2 минуты
shanemac51, прошу прощения - поздно увидел что вы отписались.
1
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 15:03 7
Цитата Сообщение от durol Посмотреть сообщение
Документ “10” – вордовский файл с 10 000 скопированными вопросами (точнее, 31 документ по 100 страниц)
Документ “40 all” – вордовский файл с 40 000 вопросами, которые надо перечитать (75 документов по
придется 31*75=2200 раз пускать макрос ----несолидно
1
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
29.03.2017, 15:31  [ТС] 8
Опередил меня.
31 документ по 100 страниц вопросов будет 1 документ с 10 000 ссылок. А вот 40 all не буду больше 200 страниц в файл сводить, даже на 8 Гб оперативки займет время для сверки.

Все работает. Благодарю.

Единственное неудобство: файл 10 – это один файл 200 страниц с 10 000 ссылок. Файл 40 all - это 75 файлов (имена 1, 2,… 75) по 200 страниц. Эти 75 файлов все должны называться “40 all.docm”, групповое переименование в тотале не применишь, так как название одинаковое. То есть надо по одному файлу переименовывать, обрабатывать, удалять и с новым так же. И так 75 раз.
0
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 15:56 9
Цитата Сообщение от durol Посмотреть сообщение
одному файлу переименовывать, обрабатывать, удалять
это можно и в макросе зациклить, не проблема

меня заинтересовало другое --31 и 75
видимо в одной порции (из 31) находятся вопросы из разных порций(из 75)
время может зашкалить --выше приемлемого

все-таки надо плясать от екселя/аксесса
--------
или открыть одну из 10-х (из 31), считать ссылки в память и прогнать циклом по всем 40-ам
и так 31 раз
1
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
29.03.2017, 17:40  [ТС] 10
Цитата Сообщение от shanemac51 Посмотреть сообщение
видимо в одной порции (из 31) находятся вопросы из разных порций(из 75)
В описании говорил, что 10 000 вопросов есть среди 40 000 вопросов.

В экселе не разбираюсь, решение в ворде подходит.

Добавлено через 51 минуту
Файл 10 состоит из 374 страниц с 12 000 ссылок.

Запустил для сверки 10 с 40, в котором 80 страниц (а не 200).
Сверяет уже 40 минут.
Долго получается.

В задании писал:
"Примечание: сверяются “10” с “40 all”. Ссылки построчно с текстом.
Быстрее было бы наоборот, но для этого в тексте (40) надо сначала найти ссылки и переходить от одной ссылки к другой для сверки с 10."

Можно реализовать сверку 40 с 10?

Так получается 12 000 ссылок сверяются с 600 вопросами на 200 страницах.
150 совпадут и удалятся, а еще 11 850 ссылок проверятся вхолостую.

Наоборот было бы быстрее.

Если для первого файла сверятся 12 000 файлов, а для 75-го - 150 файлов, то в среднем будет 6 000 на файл.
6 000 * 75 = 450 000 проверок.
Для файла 40 больше 40 000 проверок не может быть.

Спасибо.
0
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 19:01 11
сейчас проверю еще раз код, а еще лучше выложите один 10-й и пару 40-х в зипе
попробую на скорость свой вариант
1
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
29.03.2017, 19:10  [ТС] 12
Один 10 - это 12 000 ссылок
У меня уже 2 часа 10 с 40 сверяется
В таком порядке лучше не пробовать

Если только наоборот - 40 с 10
Вложения
Тип файла: zip 40.zip (412.7 Кб, 4 просмотров)
0
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
29.03.2017, 19:27  [ТС] 13
Файл 40 all теперь называется 40, если кодом будете пользоваться, то там 40 all, надо поменять.
0
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 19:37 14
Цитата Сообщение от durol Посмотреть сообщение
то там 40 all, надо поменять.
я найду, что поменять
1
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 20:04 15
ваша пара файлов обрабатывалась 7 секунд
6 секунд --считывание 10-го в память(без удаления),12000 закладок нужного типа
1сек --удаление из 40-го(из 195 удалены не все)
прилагаю протоколы
Вложения
Тип файла: zip 40_2017-03-29-19-56-31.zip (1.3 Кб, 3 просмотров)
Тип файла: log 40_2017-03-29-19-56-31.log (13.5 Кб, 3 просмотров)
0
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
29.03.2017, 20:32  [ТС] 16
Достаточно поменять в коде местами 10 и 40 и будет сверяться 40 с 10.
10 с 40 сверялось 2 часа 20 минут.
40 с 10 - 30 минут.

Так и буду сверять.

Добавлено через 8 минут
Цитата Сообщение от shanemac51 Посмотреть сообщение
из 195 удалены не все
Все и не должны быть удалены, только совпадения.

40 обратно после обработки можно вернуть в ворд с исходным форматированием для последующего чтения?
попробую эксель, но не разу им не пользовался.

Добавлено через 18 минут
Открыл скрипт0328, но эксель мне не понятен. Сделаю через ворд.
0
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 20:56 17
макрос в dic00.docm
сначала посмотрите м40.docm --что получилось после обработки(удалены 2-5-13, всего 39)
удаленные ссылки помечены желтым
Вложения
Тип файла: zip скрипт0328.zip (167.5 Кб, 6 просмотров)
1
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
29.03.2017, 21:03 18
задублируте свои файлы перед пробой
10-м ничего не будет, правятся только 4*.docm
1
9 / 9 / 0
Регистрация: 30.12.2015
Сообщений: 389
30.03.2017, 12:06  [ТС] 19
желтым цветом выделено правильно
цветом даже удобней чем удаленные, но и удаленные сойдут

в файле dic00.docm два символа FF, если открыть вордом

эксель для меня отпадает, хоть и быстро
0
Модератор
Эксперт MS Access
12080 / 4940 / 791
Регистрация: 07.08.2010
Сообщений: 14,497
Записей в блоге: 4
30.03.2017, 13:23 20
Цитата Сообщение от durol Посмотреть сообщение
два символа FF, если открыть вордом
хотела инструкцию написать, но некогда стало
FF -случайные символы, чтоб не пустой лист был

Добавлено через 3 минуты
Цитата Сообщение от durol Посмотреть сообщение
в файле dic00.docm
главное в нем --макрос, вызывается через alt+f8
--10-й считывает в память, файл не портит
--затем сканирует каталог на 4*.docm и формирует логи 4*.log, изменяет 4*.docm
1
30.03.2017, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2017, 13:23
Помогаю со студенческими работами здесь

Апгрейд за 7 тыс. грн. (прибл. 20 тыс. руб). для комфортной игры в World of Tanks на настройках выше минимальн
1) Конфигурацию моего компьютера сейчас: а) Блок питания CoolerMaster 460 W модель RS-460-RCAP-A3...

Удалить теги ссылок, которые находятся внутри тега Tittle
Суть задачи такова: нужно удалить теги ссылок, которые находятся внутри тега Tittle К примеру...

Нужна видеокарта до ~20 тыс. +- 1-2 тыс. руб
День добрый. Посоветуйте видеокарту, до ~20 тыс. +- 1-2 тыс. руб. (Москва) мать msi b150 pc...

Выбор ПК до 15 тыс. грн (1,8 тыс дол.)
Здравствуйте. Как видно с названия темы, я намерен собрать компьютер (системник + монитор) в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru