1 (изменено: Эдвард, 2014-02-18 14:26:25)

Тема: AHK: Пакетное удаление текста в строке по заданному шаблону

Дано:

Несколько блокнотов в одной папке, в каждом из которых такой текст:

Полезная информация
Важная информация
Нужная информация
Вредная и опасная информация

Задача:

Из всех файлов txt по команде горячих клавиш (#v) необходимо удалить фразу "Вредная и опасная"

Единственное, что пока удалось собрать, это:

#v::

file = E:\Новая папка\*.txt
FileRead, text, %file%
text := RegExReplace(text, "Вредная и опасная")
FileDelete, %file%
FileAppend, %text%, %file%

Однако команда не работает. Где-то допустил ошибку. А где именно, понять не могу.

Прошу помочь. Заранее благодарю.

2

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

А что, по-вашему, должно быть в переменной text после выполнения кода

file = E:\Новая папка\*.txt
FileRead, text, %file%

?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

А что, по-вашему, должно быть в переменной text после выполнения кода

file = E:\Новая папка\*.txt
FileRead, text, %file%

?

Вероятно, изменённая строка.

4

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Почитайте внимательно статью по FileRead. Разве она как-то меняет строки?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Почитайте внимательно статью по FileRead. Разве она как-то меняет строки?

По логике, FileRead считывает весь текст файла в переменную text. Далее RegExReplace совершает операции с этим текстом (в данном случае, вычленяя нежелательное содержимое). Ну и на заключительном этапе идёт перезапись файла с учётом изменений.

6

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Ну а теперь ещё раз ответьте на мой вопрос из предыдущего поста.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Ну а теперь ещё раз ответьте на мой вопрос из предыдущего поста.

Признаю ошибку. В переменной text должен быть полный текст файла с изменённой строкой.

8

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Хм, а когда её изменить-то успели? Это ведь первые две строчки. И какого именно файла, если путь задан в виде шаблона? Проверьте переменную после этого кода. Что в ней?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: Эдвард, 2014-02-20 03:53:37)

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Оказывается, код вполне рабочий (просто были проблемы с активацией команды). Однако работает он лишь с одним файлом. Имя *.txt приводит к удалению из папки всех файлов с данным расширением. Думаю, как решить проблему. Но от помощи, конечно, не откажусь.

10

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Эдвард пишет:

Оказывается, код вполне рабочий (просто были проблемы с активацией команды).

Приведённый выше код не рабочий. Покажите вариант, который у вас работает. И что имеется в виду под "активацией команды"?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Покажите вариант, который у вас работает.

#v::

file = E:\Новая папка\1.txt
FileRead, text, %file%
text := RegExReplace(text, "Вредная и опасная")
FileDelete, %file%
FileAppend, %text%, %file%
teadrinker пишет:

И что имеется в виду под "активацией команды"?

Каждый раз после правки файл команды необходимо  заново запускать. Этот момент поначалу упустил.

12

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Loop, E:\Новая папка\*.txt
{
   FileRead, text, % A_LoopFileLongPath
   FileDelete, % A_LoopFileLongPath
   text := RegExReplace(text, "Вредная и опасная")
   FileAppend, % text, % A_LoopFileLongPath
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Большое спасибо. Заработало!

14 (изменено: Эдвард, 2014-02-21 14:37:02)

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Странно. Стоило поменять расширение, и код перестал работать:

Loop, E:\Новая папка\*.html
{
   FileRead, text, % A_LoopFileLongPath
   FileDelete, % A_LoopFileLongPath
   text := RegExReplace(text, "Вредная и опасная")
   FileAppend, % text, % A_LoopFileLongPath
}

Опять чего-то не учёл (возможно, дело в кодировке)...

15

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Нужно посмотреть кодировку исходного файла и, если она не соответствует кодировке используемого интерпретатора, указать её в командах FileRead и FileAppend.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Нужно посмотреть кодировку исходного файла и, если она не соответствует кодировке используемого интерпретатора, указать её в командах FileRead и FileAppend.

Указал:

Loop, E:\Новая папка\*.html
{
   FileRead, text, % A_LoopFileLongPath, UTF-8
   FileDelete, % A_LoopFileLongPath
   text := RegExReplace(text, "Вредная и опасная")
   FileAppend, % text, % A_LoopFileLongPath, UTF-8
}

Только если в теле html-файла имеется "charset=utf-8", после выполнении команды вся кириллица превращается в кракозябры (при "charset=windows-1251" команда выполняется нормально).

Отсюда вопрос: можно ли для считывания текста файла в переменную указать универсальную (двойную) кодировку, а для записи только UTF-8?

17

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Можно только так, как в справке прописано. Ради интереса, пришлите через Attachments или через какой-нибудь сервис файл, который с кракозябрами считывается.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18 (изменено: Эдвард, 2014-02-23 21:01:35)

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Ради интереса, пришлите через Attachments или через какой-нибудь сервис файл, который с кракозябрами считывается.

Вот так выглядит файл в первозданном виде: http://med-75.narod.ru/34/335.html.

И вот так – после выполнения команды: http://med-75.narod.ru/34/335-1.html.

19

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Тогда так можно:

Loop, E:\Новая папка\*.html
{
   utf := ""
   FileRead, text, % A_LoopFileLongPath
   if RegExMatch(text, "<meta.*?charset=utf-8"">") && utf := 1
      FileRead, text, % "*P65001 " A_LoopFileLongPath
   FileDelete, % A_LoopFileLongPath
   text := RegExReplace(text, "Вредная и опасная")
   FileAppend, % text, % A_LoopFileLongPath, % "CP" . (utf ? "65001" : "1251")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Тогда так можно:...

Спасибо за готовое решение. Самому пришлось бы мучиться с этой кодировкой очень долго.

Но всё же остался один нерешённый нюанс. Команда работает только с той папкой, которая указана в шаблоне имени. А хотелось бы, чтобы распространялась и на все подпапки.

21

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Эдвард пишет:

А хотелось бы, чтобы распространялась и на все подпапки.

Гляньте в Loop (files & folders).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22 (изменено: Эдвард, 2014-02-24 16:26:36)

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Гляньте в Loop (files & folders).

Так?

Loop, E:\Новая папка\*.html, 1
{
   utf := ""
   FileRead, text, % A_LoopFileLongPath
   if RegExMatch(text, "<meta.*?charset=utf-8"">") && utf := 1
      FileRead, text, % "*P65001 " A_LoopFileLongPath
   FileDelete, % A_LoopFileLongPath
   text := RegExReplace(text, "Вредная и опасная")
   FileAppend, % text, % A_LoopFileLongPath, % "CP" . (utf ? "65001" : "1251")
}

23

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Эдвард пишет:

Так?

А работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

А работает?

Нет (хоть и не показывает ошибку).

25

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

Ну так там вариантов не так много.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Пакетное удаление текста в строке по заданному шаблону

teadrinker пишет:

Ну так там вариантов не так много.

Loop, E:\Новая папка\*.html, , 1
{
   utf := ""
   FileRead, text, % A_LoopFileLongPath
   if RegExMatch(text, "<meta.*?charset=utf-8"">") && utf := 1
      FileRead, text, % "*P65001 " A_LoopFileLongPath
   FileDelete, % A_LoopFileLongPath
   text := RegExReplace(text, "Вредная и опасная")
   FileAppend, % text, % A_LoopFileLongPath, % "CP" . (utf ? "65001" : "1251")
}

Вот так вроде уже работает...