VBA заменяет определенную каретку

Все.

Я привык программировать VBA в Excel, но не знаком со структурами Word. Я работаю с библиотекой текстовых файлов, чтобы обновить их. Многие из них либо являются документами OCR, либо были введены вручную.

У каждого есть повторяющийся шаблон, наиболее распространенным из которых является ненужный возврат каретки.

Например, я просматриваю несколько текстовых файлов, в которых после каждой строки есть двойной возврат. Поиск и замена всех двойных возвратов каретки удаляет все различия абзацев. Однако каждая строка имеет длину примерно 30 символов, и если я вручную выполняю следующую логику, это дает мне функциональный документ.

Если после 30+ символов есть двойной возврат каретки, я заменяю их пробелом. Если до двойного возврата было меньше 30 символов, я заменяю их одинарным возвратом.

Может ли кто-нибудь помочь мне с некоторым элементарным кодом, который поможет мне начать работу над этим? Затем я мог бы изменить его для каждого имеющегося у меня «шаблона» текстовых документов.

e.g.

In this case, there are more than

thirty characters per line.  And I

will keep going to illustrate this

example.

This would be a new paragraph, and

would be separated by another of

the single returns.

Я хочу, чтобы код возвращал:

In this case, there are more than thirty character returns. And I will keep going to illustrate this example.

This would be a new paragraph, and would be separated by another of the single returns.

Дайте мне знать, если кто-нибудь может выбросить что-нибудь, с чем я могу поиграть!


person BLP_1975    schedule 04.09.2018    source источник
comment
Я попытался настроить ваш пример, так как форматирование сайта удаляет лишние пробелы. Не уверен, правильно ли я понял... Я только что прошел через что-то подобное с набором огромных файлов... и, наконец, понял RegEx в процессе. Вероятно, это самый простой/быстрый способ... Вы использовали RegEx? Кроме того, это одноразовая вещь или что-то, что нуждается в автоматизации в будущем? Если разово для набора файлов (или настолько редко, что можно сделать вручную), могу ответить пошагово с помощью Notepad++. В противном случае VBA+RegEx может быть лучше. И просто для подтверждения, вы сказали, что это текстовые* файлы? (не docx и т. д.)   -  person ashleedawg    schedule 04.09.2018
comment
+1 за идею RegEx и NP++... вы можете использовать RegEx в VBA, но это требует небольшой настройки... вы можете повозиться здесь: regex101.com/r/zG9GPw/1   -  person SlowLearner    schedule 04.09.2018
comment
Отлично, спасибо, буду!   -  person BLP_1975    schedule 05.09.2018
comment
@ashleedawg - я только начал немного играть, я не использовал RegEx, но он выглядит полезным. По сути, это одноразовый снимок, поэтому, если у вас есть шаги с использованием Notepad ++, это было бы здорово. Да, это текстовые файлы, а не docx или что-то в этом роде.   -  person BLP_1975    schedule 06.09.2018


Ответы (2)


Вы можете сделать это без кода (который требует RegEx), просто используя собственные подстановочные знаки инструментов поиска/замены Word, где:

Find = ([!^13]{30,})[^13]{1,}
Replace = \1^32

и, чтобы очистить остаточные разрывы нескольких абзацев:

Find = [^13]{2,}
Replace = ^p

Вы могли бы, конечно, записать это как макрос...

person macropod    schedule 04.09.2018
comment
Спасибо! Я не играл с условными операторами в Find/Replace. Я также поиграю с ответами по кодированию, просто чтобы обдумать варианты. - person BLP_1975; 05.09.2018
comment
Спасибо! Все еще не получаю именно те результаты, которые мне нужны, но я только начал смотреть на подстановочные знаки «Найти/Заменить». - person BLP_1975; 06.09.2018
comment
Вы можете найти msofficeforums.com/word / полезно для решения проблем очистки в более общем плане. Полезную информацию о подстановочных знаках см. на странице wordmvp.com/FAQs/General/UsingWildcards.htm. - person macropod; 06.09.2018
comment
Просто хотел еще раз сказать спасибо, все еще играю с ним. Я думаю, проблема в том, что некоторые из возвратов каретки не являются одним и тем же символом... Он заменяет некоторые двойные возвраты, как я ожидаю, но, похоже, пропускает некоторые из них. В любом случае, буду продолжать играть, просто хотел сказать спасибо за эту опцию в дополнение к кодам! - person BLP_1975; 08.09.2018
comment
Второй F / R заменит все повторяющиеся возвраты каретки одним, хотя вы можете получить пару из них перед таблицей, если она есть в вашем документе. Возможно, в вашем документе также есть ручные разрывы строк. При включенном отображении форматирования Word вы увидите разрывы абзацев в виде символов ¶ и ручные разрывы строк в виде символов ↵. И, если вы работаете с таблицами, их маркеры конца ячейки и конца строки выглядят как символ ¤; вы не можете удалить их через «Найти/Заменить». - person macropod; 09.09.2018

Вот регулярное выражение, которое может вам подойти:

(\n\n)(?<!\.(\n\n))

Замена — это просто пространство, вы можете попробовать его (и изменить / настроить) здесь: https://regex101.com/r/zG9GPw/4

Этот «шаблон» указывает движку RegEx искать символ новой строки \n, который встречается x2, как это \n\n (стоит отметить, что это из вашего вопроса и может отличаться в ваших файлах, например, может быть \r\n) и предполагает, что допустимый разрыв строки будет предваряться точкой: \..

В RegEx символ точки представляет собой подстановочный знак из одного символа, поэтому его необходимо экранировать с помощью '\' (n и r являются обычными символами, их экранирование сообщает RegEx engine они представляют символы новой строки и возврата).

Итак... выражение ищет группу символов новой строки x2, но затем использует отрицательный просмотр назад, чтобы исключить любые совпадения, где предыдущий символ был точкой.

В любом случае, все это объясняется на сайте: введите здесь описание изображения


Вот как вы можете найти и заменить RegEx с помощью NotePad ++ (я не уверен, идет ли он с RegEx или нужен ли плагин, в любом случае это легко). Но вы можете установить местоположение, фильтры (для таргетинга на определенные типы файлов) и другие параметры (например, поиск в подкаталогах).

введите здесь описание изображения

Кроме этого, как указал @MacroPod, вы также можете сделать это с помощью MS Word, документ за документом, без использования какого-либо кода :)

person SlowLearner    schedule 04.09.2018
comment
Спасибо - только начинаю играть с RegEx и программировать и получать от этого удовольствие - лол - но мне нужно сделать это, прежде чем я повеселюсь. Попробую несколько других вариантов, а потом научусь этому! :) - person BLP_1975; 06.09.2018
comment
@ BLP_1975 эй, для одного снимка NotePad ++ сделает это легко (при условии, что вы используете простые текстовые файлы). Я обновлю свой ответ изображением для NP++ - person SlowLearner; 06.09.2018