Страницы: 1 2 След.
RSS
Пакетная замена текста в Word по словарю в Excel
 
Добрый день.
Присутствует потребность, в пакетной замене текста в документе word по словарю замены в excel.
Изначально пробовал составлять список замены и пользоваться сторонними приложениями (макрос Александра Витера/@TextReplacer/Replace Genius/etc) для замены текста напрямую в ворде, но все они столкнулись с одной бедой - они не переваривают очень большой словарь для замены - мне необходима возможность за раз переваривать словарь, порядка 100000 строк.
Может кто сталкивался с подобной проблемой и есть ответ?
 
Вам надо искать компромисс между количеством слов в документе и словарем замен. Поиск можно вести 100000 раз по документу, заменяя слова если они есть и так по каждому документу, или брать слово в документе и смотреть есть ли оно в словаре. если есть, то менять.  если исключить навороты, то макрос Александра Витер работает по варианту 1. добавить в него список и крутить цикл по нему - не проблема, но боюсь что скорость вас не порадует.
По вопросам из тем форума, личку не читаю.
 
Продолжу ответ Михаила. 100 000 слов для словаря (Scripting.Dictionary или Collection) - не много. Если  форматирование текста не интересует, то должно быть быстро.
Если форматирование интересует, то макрос должен выполняться в приложении MS Word. Этот макрос вполне способен в начале своей работы открыть документ Excel и прочитать из него словарь.
Изменено: sokol92 - 25.08.2021 12:51:13
Владимир
 
Цитата
sokol92 написал:
Если форматирование интересует, то макрос должен выполняться в приложении MS Word.
это не обязательно. Хоть из Outlook.
Тут вопрос больше, сколько по времен будет поиск одного слова в документе в противовес поиска в славаре каждого слова из документа. Не, ну можно схитрить и найдя заменять во всем тексте занося в другой словарь, для последующей проверки, что это слово уже заменялось и если да то переходить к следующему, но что-то мне подсказывает что будет не быстрее. встроенного Replace.
По вопросам из тем форума, личку не читаю.
 
Я понимаю, что каждый раз прогонять миллионы слов ради подходящей замены будет гораздо медленнее, чем смотреть наличие 100000 слов в тексте и заменять по его наличию.
Я хотел узнать, есть ли у вас готовые решения, в скриптах я не силен от слова совсем.

Цитата
БМВ написал: макрос Александра Витер
Толи я кривой, толи еще чего, но у меня он не может найти и выполнить замену по моему списку, только если по одной строке - то тогда получается.
По правде говоря, он у меня сразу и не запустился, запускался с ошибкой в модуле, мб в этом проблема. Скриншот прилагаю
Изменено: vikttur - 25.08.2021 23:47:09
 
Цитата
penapple написал:
есть ли у вас готовые решения
Выложите два файла, приближенных к "боевым": фрагмент текста (Word) и словаря замен (Excel). Кто-нибудь подготовит решение. Алгоритм ясен.
  • формируем словарь. Ключ - слово для замены, значение - на что заменить.
  • цикл по словам документа. Проверяем на наличие в словаре. Если есть, то делаем замену во всем документе и удаляем слово из словаря.
Должно работать быстро при заявленных объемах.
Изменено: sokol92 - 25.08.2021 18:49:25
Владимир
 
sokol92,  всё от документа зависит и количества слов в нем.
Изменено: БМВ - 25.08.2021 19:23:00
По вопросам из тем форума, личку не читаю.
 
Михаил, ждем пример.
Изменено: sokol92 - 25.08.2021 19:01:55
Владимир
 
Цитата
sokol92 написал:
ждем пример.
согласен, я вааще думал что надо обработать так несколько файлов, для меня пакетная применима именно к этому множеству.
По вопросам из тем форума, личку не читаю.
 
Вот образец, сильно урезанная версия, без текста только то-что необходимо заменить.
Если нужно - то могу подготовить подобные файлы на несколько тыс строк.
 
Цитата
БМВ написал:
для меня пакетная применима именно к этому множеству.
К сожалению тут ситуация иная, отдельный словарь к отдельному файлу
 
penapple,тогда несколько вопросов
1. может и быть ситуация циклической замены, может быт не бесконечной, но . Я про случай когда значение A по словарю меняется на B , B - C , С-D ... и хуже всего если Z-A?
В этом случае придется брат каждое значение и заменять
2. То что в примере реальные данные или просто пример?
3. Может есть логика замен? Точнее я её даже вижу, =REPLACE(REPLACE(A2;3;1;)+1333;3;;"+"). Если так то и словарь будет не нужен.
Изменено: БМВ - 26.08.2021 08:17:04
По вопросам из тем форума, личку не читаю.
 
БМВ,

1) Нет, все четко, если в тексте есть значение А, которое попадается 1 или много раз, то во всех случаях оно должно быть заменено на значение В. Дополнительное условие - словарь под замену будет для всех случаев. Например в словаре, как говорил выше, будет 100000 вариантов замены А на В, а в тексте, например значения А может и не быть, что бы его поменять на В, тогда, как я предполагаю, должен идти поиск по следующей паре С-D...и тд
2) значения примерно реальные, в данном примере значение меняется на 1+333 (КМ+метры), но не везде подобного рода есть замены, будут попадаться другого формата данные, но в словаре заменяемый текст (А) и заменяющий текст (В) будут присутствовать.
3) Как и писал выше 1+333 к каждому значению прибавляется, но словарь будет все-равно нужен так как пункт 2.
 
penapple,
как вариант от простофили  ;) (вставляем в модуль в Word)
Код
Sub OpenAWorkbook()
Dim xlApp As Object
Dim xlBook As Object
    On Error Resume Next
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD 'используем короткое обращение к объекту
    .Title = "Выберите файл"
    .AllowMultiSelect = False
    .ButtonName = "Выбрать"
    .Filters.Clear
    .Filters.Add "Excel files", "*.xls; *.xlsx; *.xlsm"
        If oFD.Show = 0 Then
            ActiveWindow.View.ShowFieldCodes = False
        Exit Sub 'показывает диалог
        End If
    strWorkbookName = .SelectedItems(1)
    End With

    Set xlApp = GetObject(, "Excel.Application")
    If Err Then
        Set xlApp = CreateObject("Excel.Application")
    End If
    On Error GoTo 0
    Set xlBook = xlApp.Workbooks.Open(FileName:=strWorkbookName)
    xlApp.Visible = False
    
    lLastRow = xlApp.ActiveSheet.UsedRange.Row + xlApp.ActiveSheet.UsedRange.Rows.Count - 1
    For n = 2 To lLastRow
    a = xlApp.ActiveSheet.Range("A" & n).Value
    b = xlApp.ActiveSheet.Range("B" & n).Value
    
    With ActiveDocument.Range.Find
      .Text = a
      .Replacement.Text = b
      .Execute Replace:=wdReplaceAll
    End With
    Next
    
xlApp.Workbooks.Close
'lbl_Exit:
    Set xlApp = Nothing
    Set xlBook = Nothing
    Exit Sub
End Sub

Изменено: evgeniygeo - 26.08.2021 08:28:29
 
ну понятно
Цитата
penapple написал:
Нет, все четко, если в тексте есть значение А
то есть вероятность того что после первой замены, уже замененное значение есть в словаре и потом снова заменится, хотя и не нужно -  есть. а это делает алгоритм #14 ошибочным

ну я пока вот так сделал, если замена по логике .
Код
    Const Delta= 1333
    For Each rng In ActiveDocument.Sentences

              If Len(rng) = 8 Then ActiveDocument.Range(rng.Start, rng.End).Text = _
              Format(CLng(Left(Replace(rng, "+", ""), 5)) + delta, "00\+000")
    Next
P.S. мне мама не разрешает длинные макросы писать.
Изменено: БМВ - 26.08.2021 08:48:02
По вопросам из тем форума, личку не читаю.
 
Вы правы, о таком раскладе я не подумал, а стоило бы.

upd. Ну все, вариант с заменой по полному словарю полностью отпадает.
Изменено: vikttur - 26.08.2021 11:44:05
 
penapple, просто  надо ставить задачу более конкретно, до примера , думаю каждый думал о замене фраз или реальных слов, а не значений в таблице. Вероятность и там была что подобные замены приведут замену имен что все вместо Саша, Коля, Паша, станут Яша,

Цитата
penapple написал:
будут попадаться другого формата данные, но в словаре заменяемый текст (А) и заменяющий текст (В) будут присутствовать.
пример можно?  
По вопросам из тем форума, личку не читаю.
 
Цитата
penapple написал:
upd. Ну все, вариант с заменой по полному словарю полностью отпадает.
не совсем. если делать замену  не во всем документе а брать предложение, как делал я, то можно и со словарем, но пока при том что есть математический вариант - я б не заморачивался.
так же можно изголятся и сперва пройтись по словарю до последнего зависимого вхождения и делать замены в обратном порядке возвращаясь из рекурсии, но при этом надо удалять из словаря то что заменили, чтоб не тратить время потом. Тут может появится другой вопрос, а что если два изменения должны приводить к одинаковому значению? тогда  удалять нельзя.  
Изменено: БМВ - 26.08.2021 09:11:33
По вопросам из тем форума, личку не читаю.
 
БМВ,В принципе, там тоже, думаю, можно математически разобраться.

Upd. Хотя нет - не везде есть четкая логика, эти числа зависят от других чисел, которые тоже должны быть заменены
Изменено: penapple - 26.08.2021 09:16:05
 
может подскажет что за логика,, а то я там голову ломал, а оказалось
Цитата
penapple написал:
1+333 (КМ+метры)
сделать вариант другой логики можно по + и - ?
По вопросам из тем форума, личку не читаю.
 
Подготовил более "боевой" формат
с изменением в "-"
Словарь_2 (гугл диск)
Изменено: penapple - 26.08.2021 10:19:24
 
penapple,
1 ссылка не открылась
2. почему вам надо это делать именно в word? перенести в excel  обработать, при этом возможно даже формулами, вернуть обратно - дело минутное
По вопросам из тем форума, личку не читаю.
 
БМВ,
1) поправил ссылку.
2) Такое дело, что в документе много таблиц, иногда значения посреди текста, а не в своих ячейках, иногда эти значения идут через "-". И есть не иллюзорный шанс что-то пропустить.
 
Добрый день! А "+" единственный символ в словаре (столбец A), отличный от буквы и цифры? Если есть еще такие символы, то укажите все.
Владимир
 
Еще есть символ "-", в данном словаре я его не указал
Изменено: vikttur - 26.08.2021 12:04:15
 
таак, тепер везде -9264
penapple, забываем про словарь,  про  замены, про....  какая задача, как получены эти значения в словаре.
По вопросам из тем форума, личку не читаю.
 
БМВ,Значения в словаре получены путем перерасчета оригинальных значений, в последнем словаре -9264
 
А пробелов в заменяемом тексте не будет? Типа "310 + 001"
Владимир
 
sokol92, нет, пробелов не будет
Изменено: vikttur - 26.08.2021 12:31:33
 
penapple, пользуйтесь кнопкой цитирования по прямому ее назначению, а не для ответа. Надоело уже удалять после Вас...
Страницы: 1 2 След.
Наверх