суббота, 28 июля 2018 г.

Массовая замена текста, встерчаем uvFilesCorrector

uvFilesCorrector
Название: uvFilesCorrector
Аналог: текстовые редакторы
Размер скачиваемого файла: 0,8 Мб
Сайт: http://www.uvsoftium.ru
Как часто возникает необходимость заменить что-нибудь в файле? Регулярно. С этой задачей прекрасно справляется большинство текстовых редакторов. Но что если нужно найти и заменить текст не в одном, а двух, трех, десяти файлах? Эта работа может отнять очень и очень много времени: с каждым файлом нужно работать в отдельности. А что если можно было бы взять и заменить нужный текст сразу во всех файлах? Можно. uvFilesCorrector – это именно то, что сэкономит много времени и сильно облегчит работу.
Программа позволяет производить замену сразу в нескольких файлах и не только. Вообще функционал очень широк:
Исправление в нескольких файлах одновременно
Замена в буфере обмена
Замена выделенного текста
Последовательные замены
Поддержка XML документов
Наибольший интерес и практическую пользу представляет, конечно же, замена текста в нескольких файлах сразу. Остальные функции программы тоже очень важны, но все же меркнут на фоне ее главного козыря.
Интерфейс
Он прост и дружелюбен. Окно программы содержит два главных поля. Первое предназначено для работы со списком замен, который будет подробно рассмотрен далее, а вторая для работы с файлами. Также второе окно позволяет просматривать и изменять буфер обмена.
Теперь рассмотрим некоторые моменты более подробно.
Выбор файлов
Самая важная функция, на которой основываются все остальные. Ведь без выбранных файлов невозможно произвести замену. Выбор проходит по следующему алгоритму:
1. Выбор папки с файлами.
2. Выбор нужных файлов из этой папки.
После выполнения второго шага становится возможным выполнение всех остальных операций.
Небольшой, но удобной мелочью является то, что файлы в папке можно отсортировывать по типам: *.txt, *.html, *.htm, *.php. Если файлов много и они разных типов, то эта маска сильно облегчит поиск нужных.
uvFilesCorrector screen1
Список замен в файле
Принцип работы этой функции заключается в том, что пользователь создает какой-то список с заменами, а программа их последовательно выполняет.
В каждой замене есть возможность перехода на новую строку с помощью выражения [nw].
Также важным моментом является то, что можно применять не весь список, а только выделенные его элементы. Эта мелочь кажется несущественной, но если содержится, например, 100 позиций и одна из них совершенно не нужна для последующей замены, то создание нового списка из 99 элементов может отнять немало времени и выгода от использования программы сойдет на нет.
Элементы списка могут свободно перемещаться вверх и вниз. Для этого предназначены соответствующие кнопки.
Имеется возможность сохранения готовых списков в отдельные файлы для последующего их использования.
uvFilesCorrector screen2
Замена
После того, как был создан список (или хотя бы один его элемент) замен и добавлены все необходимые файлы, можно приступать к самой процедуре замены.
Собственно, она до невозможности проста и выполняется нажатием всего лишь одной кнопки “заменить”.
При замене можно учитывать регистр текста или же нет – все в зависимости от требований текущей задачи.
Помимо того, что можно менять текст в файлах, имеется возможность и изменения текста, содержащегося в буфере обмена. Программа сама обнаруживает информацию, хранящуюся в буфере, и автоматически выводит ее в поле вкладки “буфер обмена”. Если в буфере оказывается кусок, который можно заменить на какой-то элемент из списка замен, то он будет заменен. Если же такого куска не окажется, то текст останется без изменений. После завершения работы с текстом необходимо нажать всю ту же кнопку “заменить”. Отредактированный текст будет доступен также, как и обычный: ctrl+v.
Для облегчения работы с текстом в буфере предусмотрено наличие горячих клавиш, ведь не очень удобно каждый раз обращаться к окну программы. Комбинация ctrl+shift+c выполняет действия, аналогичные нажатию кнопки “заменить”, а ctrl+v вставляет уже измененный текст.
Замена при выполнении и невыполнении условия
Бывает, что файлов выбрано очень много и не совсем понятно какие нужно редактировать, а какие нет. Возможно, что некоторые уже были исправлены или просто не нуждаются в обработке. Для таких случаев предусмотрена функция замена при условии. Она содержит два элемента: “заменять если” и “не заменять если”. Принцип их работы абсолютно идентичен, но результат будет прямо противоположен. Стоит отметить, что замена (или не замена) произойдет только в том случае, если все заданные условия будут выполнены. Условий может быть одно или два.
Регулярные выражения
Не всегда известно то, какой именно текст нужно найти и заменить. Иногда случается так, что известны только какие-то его определенные свойства: телефон, адрес или еще что-то. В таких ситуациях инструмент регулярных выражений будет незаменим. Воспользоваться им можно во время добавления нового элемента в список замены. Программа содержит полную справку по элементам языка, а также мастера, который помогает правильно составить нужное выражение.
uvFilesCorrector screen3




UV FilesCorrector

UV FilesCorrector - программа для быстрого исправления текстовых файлов, текста в буфере обмена и просто выделенного текста.
  • Что делать когда в тексте нужно произвести сразу несколько разных замен?
  • Или нужно заменить текст сразу в десятке-другом файлах?
  • Или нужно найти и заменить многострочный текст?
  • Или найти (заменить на) нестандартные символы (табуляция, © и др.)?
Обычный механизм замены тут не помощник. Либо долго, либо вообще невозможно. А вот с UV FilesCorrector эта задача становится очень простой и быстрой.
Вот неполный список возможностей программы по работе с текстом:
  • Возможность исправлять сразу множество файлов
  • Производить множество разных замен друг за другом
  • Заменять выделенный текст в любой программе
  • Использовать в поиске и замене нестандартные символы (например ©, ® и многие другие)
  • Использовать поиск по шаблону (регулярные выражения)
  • Есть возможность работать с файлами XML, используя язык запросов xPath.
  • И многое другое
И все это одним нажатием на кнопку!

Содержание



Список замен

Замены производятся в том порядке в котором они находятся в списке. Срабатывают только отмеченные замены.
Невидимые символы обозначаются в списке условными обозначениями в квадратных скобках. Например переходы на новую строку обозначаются как [nw], табуляция как [t] и т.д. Условные обозначения показаны под списком замен.

Создание и редактирование замены

При создании и редактировании замены открывается окно, показанное ниже.
В тексте "Что найти" и "Заменить на" можно использовать переход на новую строку и табуляции.
В новой версии можно задавать количество повторений замены. Например если нужно заменить повторяющиеся пробелы, оставив один единственный. Переключаем опцию "Повторять замену" на "Пока есть что заменять". Все лишние пробелы будут удалены.

Замена текста в файлах

Примерный порядок действий:
  • Выбрать папку с файлами
  • Задать маску файлов, если нужно (в примере это "*.txt;*.xml")
  • Отметить нужные файлы
  • Нажать кнопку "Заменить"
По завершению обработки файлов будет выдано сообщение о количестве произведенных замен.
Можно посмотреть журнал произведенных замен.

Замена текста в буфере обмена

Вкладка "Буфер обмена" показывает текст, скопированный в буфер обмена. При нажатии кнопки "Заменить" этот текст в соответствии со списком замен. После этого можно сразу вставлять измененный текст с помощью Ctrl + V.
Добавлена возможность заменять текст в буфере обмена по горячей клавише Ctrl + Shift + C.

Замена выделенного текста в любой программе

Добавлена горячая клавиша Ctrl + Shift + X для замены выделенного текста в любой программе. Не важно в какой программе Вы редактируете текст. Просто выделите текст и нажмите Ctrl + Shift + X.

Замена в XML файлах

Для этого необходимо при редактировании замены отметить галочку "XML" и задать xPath. Затрагивается только текст в атрибутах и между тэгами (в том числе в разделе CDATA). Ищутся все элементы для которых условие xPath истинно. Текст заменяется в самом элементе и во всех дочерних элементах (см. пример 2.а). Расширение файла может быть любым (необязательно xml).
Примеры: Заменим "text" на "TEXT", но не во всем тексте, а только в нужных местах
Исходный XML (фрагмент)
  <item id="1" name="plain_text">
    <title>text color</title>
    <desc>text color</desc>
  </item>
1. xPath = "//item/@name"
Результат:
  <item id="1" name="plain_TEXT">
    <title>text color</title>
    <desc>text color</desc>
  </item>
2. xPath = "//item"
Результат:
  <item id="1" name="plain_text">
    <title>TEXT color</title>
    <desc>TEXT color</desc>
  </item>
3. xPath = "//item/title"
Результат:
  <item id="1" name="plain_text">
    <title>TEXT color</title>
    <desc>text color</desc>
  </item>
Примечание:
Если при указании xPath не указывать "что найти", то будет заменен любой текст по указанному xPath.

Работа с командной строки

Для запуска UV FilesCorrector с командной строки нужны два файла: 
- файл, содержащий список файлов для замены
- файл, содержащий список замен (создайте необходимые замены с помощью UV FilesCorrector и сохраните в файл).

Утилита запускается в скрытом режиме и закрывается после завершения работы. Формат команды:
"UV FilesCorrector.exe" "Files.txt" "Replaces.lst"
Пример файла Files.txt со списком файлов для замены. Имена файлов должны быть на отдельных строках. Можно использовать полные и относительные (относительно папки в которой лежит Files.txt) пути к файлам.
c:\Temp\Test.txt
Годовой отчет.txt
Docs\Документ1.txt
В качестве примера файла Replaces.lst можно взять файл Default.lst из каталога программы.
Внимание:
Будут произведены только те замены в которых <Checked>1</Checked>

Заменить при условии

Допустим в папке много файлов в которых нужно исправить текст. Но в некоторых файлах исправлять не нужно (либо уже исправлено, либо просто не нужно). В таких случаях бывают полезными дополнительные условия замены, где можно указать:
  • Заменять если присутствует текст "..."
  • Заменять если отсутствует текст "..."
  • Не заменять если присутствует текст "..."
  • Не заменять если отсутствует текст "..."
Текст будет заменен только при выполнении всех указанных условий.

Поиск по шаблону (регулярные выражения)

Очень мощный инструмент для поиска. Когда неизвестен сам текст, но известны его свойства. Например найти и удалить из текста все e-mail адреса или телефоны.
В качестве очень простого примера приведем такое регулярное выражение:
\d{3}
Такое выражение ищет в тексте три цифры подряд. Можно искать в тексте e-mail, URL, номер телефона и многие другие вещи.
Теперь в UV FilesCorrector есть Мастер, помогающий в составлении регулярных выражений.
Само окно мастера содержит краткий справочник по регулярным выражениям и средство проверки составленных выражений
Для проверки регулярного выражения заполните текстовое поле "Текст для проверки". Если отметить галочку "Анализировать каждую строку", то регулярное выражение будет применяться к каждой строке. Иначе ко всему тексту целиком. При проверке следует указывать как строки, подходящие по условию, так и те которые должны быть пропущены.
Фрагмент регулярного выражения в скобках образует подмаску (подтекст) который можно использовать в "Заменить на". $1 - первая подстрока, $2 - вторая и т.д. Подробнее на примерах ниже.
Исходный текстШаблонЗаменить наРезультат
before 1234 after(\d+)цена $1 руб.before цена 1234 руб. after
before 1234 after(\d+)$1.00before 1234.00 after
before 1234 after(\d{2})(\d{2})$2$1before 3412 after
... abc@mail.ru ...\s([\w.]+@[\w.]+)\s<a href="mailto:$1">$1</a>... <a href="mailto:abc@mail.ru">abc@mail.ru</a> ...


Удобные "фишки"

В новой версии добавлены:

  1. Галочка "Только отмеченные" для списка замен и списка файлов. Отображаются только отмеченные элементы, часто это довольно удобно.
  2. Добавлена опция "Во всех вложенных подпапках" для списка файлов. Все найденные файлы, удовлетворяющие условиям отбора, отображаются в списке.
    Имя файла в списке показывается относительно выбранной папки.
  3. Быстрый фильтр для списка замен и для списка файлов. Набирая текст при включенном фильтре, Вы оставляете в списке только те файлы, в имени которых встречается набранный текст.
  4. Мастер для составления и отладки регулярных выражений

МАССОВАЯ ЗАМЕНА СЛОВ


Предположим, что нам необходимо заменить все "ул." на листе на "улица ". Или русское слово "дом" на английское "house". Или еще интереснее: все английские буквы на русские. Например, английская "а" должна быть заменена на русскую "a", английская "c" на русскую "с", английская "H" на русскую "Н" и т.д. А такое тоже нередко бывает и доставляет проблемы. Ведь если в одной таблице будут русские буквы, а в другой английские - то применение большинства встроенных функций поиска(та же ВПР) просто не найдут соответствия.
Если подобную замену надо сделать для одного сочетания, то все просто: жмем Ctrl+H и указываем что заменить и на что. Но если таких замен надо сделать 20? Или 120? Это надо будет 120 раз нажать и ввести что заменять и на что. А если это надо сделать еще и не в одном документе - то...Думаю сами справитесь с умножением количества замен на количество файлов, в которых это надо сделать. И вроде бы простая операция превращается в ваш личный ад на работе.
Недавно на форуме участнику потребовалось автоматизировать именно такую штуку. Т.к. код несложный - решил написать и чуть дополнив выложить для всех кому код может потребоваться:
Как это работает. В книге есть специальный лист с именем "Соответствия". На нем в столбце А записаны слова, которые необходимо заменить, а в столбце В - на что эти слова заменить. Если в столбце А пусто - то замена не будет произведена. Если в столбце В пусто - то значение из столбца А будет просто удалено.
Замены производятся исключительно в выделенных на листе ячейках. Ячейки могут быть несмежными.
Итак, необходимо сделать много замен. Скачиваете файл:
  Массовая замена слов (54,5 KiB, 3 926 скачиваний)

Примечание: Я сделал файл как переводчик. Т.е. в первом столбце русские слова, во втором английские. Но в столбцах может быть что угодно - хоть слова, хоть символы, хоть числа.
На лист "Соответствия" записываете в столбец А - что заменять, в столбец В - на что заменять. Переходите на лист книги, в котором необходимо произвести замену. Выделяете ячейки, значения в которых надо найти и заменить. После чего жмете Alt+F8 и выбираете макрос "Tips_Macro_ReplaceMASS.xls!Replace_Mass"(или просто "Replace_Mass", если код в той же книге, что и ячейки для поиска и замены).
Первым появится окно с запросом направления перевода. По умолчанию 1(ru-en). Т.е. будет браться слово из столбца А и заменяться словом из столбца В. Но если указать 2 - то будет браться слово из столбца В и заменяться словом из столбца А. Т.е. аналог переводчика - с рус. на англ. и наоборот. Либо из А в В, либо из В в А.
Вторым появится запрос на метод просмотра данных:
  • если указать "1 - по всему тексту" - данные из столбца А будут заменять только в том случае, если ячейка в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа "Соответствия". Например, в любой из выделенных ячеек записано "На столе книга", а на листе "Соответствия" в столбце А есть только слово "книга". Замена не будет произведена, т.к. необходимо, чтобы в столбце А было так же "На столе книга".
  • если указать "2 - по части ячейки" - данные из столбца А будут заменять в случае, если ячейка в выделенном для замены диапазоне содержит любое слово из столбца А листа "Соответствия". На том же примере - "На столе книга". Если выбрать 2, то в тексте "На столе книга" слово книга будет заменено на слово из столбца В - "book".

И еще один практический пример чуть модифицированного кода. Предположим, имеется таблица выручки по реализации продукции:
Таблица выручки
Как видно, здесь присутствую только номера статей, но нет их расшифровки. Зато расшифровка есть в отдельном листе "Справочник":
Справочник
Как видно, в справочнике присутствуют нужные номера статей и можно было бы применить ту жеВПР(VLOOKUP) для замен. Если бы не одно но: в таблице по реализации помимо номеров статьей есть еще лишний текст "Статья затрат:". Конечно, можно сначала заменить этот текст, потом в отдельном столбце применить ВПР, заменить формулу значениями и вернуть в исходный столбец. Если при этом надо еще оставить текст "Статья затрат:", то надо будет сделать еще доп.манипуляции либо при составлении формулы, либо после. В любом случае - слишком много лишних телодвижений. А значит бОльшие времязатраты.
Приложенный ниже файл поможет сделать это в разы быстрее:
Скачать файл с примером и кодом:
  Массовая замена слов - статьи.xls (91,5 KiB, 652 скачиваний)

и в итоге за пару секунд получим следующий результат:
Результат замены
Достаточно выделить столбец со статьями на листе с реализацией и запустить код(либо нажатием кнопки заменить значения, либо нажав Alt+F8 и выбрав из списка макросов макрос Replace_Mass).
После нажатия на кнопку будут запрошены следующие параметры:
  1. указать номер столбца значений в листе "Справочник", в котором искать соответствия номерам статей(в нашем случае это столбец 1(А))
  2. указать номер столбца, значениями которого заменять найденные в таблице реализации значения(это может быть один из трех столбцов справочника: Группа затрат, Статья затрат, Подстатьи затрат). Логичнее всего указать столбец 4, т.к. он наиболее детализирован и конкретнее указывает расшифровку статьи
  3. далее будет предложено указать точность поиска:
    • если указать "1 - по всему тексту" - данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне полностью совпадает со значением из столбца А листа "Справочник". Т.е. если бы у нас в таблице реализации был бы записан только номер статьи(1.01), тогда можно было бы указать именно 1
    • если указать "2 - по части ячейки" - данные будут заменены только в том случае, если значение ячейки в выделенном для замены диапазоне содержит любое значение из столбца А листа "Справочник". Это больше подходит к описанному случаю, т.к. нам необходимо заменить исключительно номер статьей на их расшифровку, оставив при этом текст "Статья затрат: "
Если все указано корректно, то на листе будут произведены все необходимые замены.
Возможные ошибки, которые предусмотрены кодом и о которых будет сообщено соответствующим сообщением(код прервется, замены не будут произведены):
  • на листе Справочник нет значений
  • в качестве столбца для поиска значений и для замены значений на листе Справочник указано одно и то же число
  • в качестве столбца значений для замены указано число, превышающее общее количество столбцов на листе Справочник
Особое внимание хочу уделить случаю, когда выбирается замена по части ячейки. В этом случае лучше список на листе Справочник отсортировать по длине текста по тому столбцу, в котором будут значения для поиска. Зачем это надо: т.к. значение по части ячейки будет заменять не полное соответствие, то есть вероятность неверных замен. Например, есть текст "Статья затрат: 1.011". В то же время на листе Справочник есть статьи"1.01" и "1.011". Т.к. "1.01" идет раньше в большинстве случаев, то текст будет заменен некорректно: "Статья затрат: ТВ1".
Чтобы получить длину строки текста можно использовать функцию ДЛСТР(LEN):
=ДЛСТР(A2)
=LEN(A2)
В отличие от кода, приведенного в начале статьи, код во втором файле позволяет производить замену не только на основании двух столбцов, но и ориентируясь на таблицу данных, как видно из реализации. Можно выбрать любой столбец Справочника для поиска значений и так же любой для замены, что предоставляет большую гибкость по замене значений.