1 (изменено: belyankin12, 2017-01-28 19:35:00)

Тема: AHK: Удаление строки из текстового файла

Здравствуйте. Возникла необходимость удалить из текстового файла строчку. Поиск нужной строки я буду осуществлять с помощью RegExMatch. Тут я вам покажу набросок того, как я хочу это делать. Это, по сути, готовый код без команды, что непосредственно выполняет удаление строчки.
Вот файл, что нужно отредактировать:


Text_Text - Reason
Hex_Hex - Reason1

Вот код скрипта:


file := A_ScriptDir "\file.txt"
var := "Hex_Hex"

log := {str:"",find:0,num:0}    ,    log.str := []

Loop, read, %file%
log.str.Insert(A_LoopReadLine)    ,log.num := A_Index
				
loop 1000	
if RegExMatch(     log.str[log.num + 1 - A_Index]
,"" . var . " - (.*)"
, end_str) and (log.find:=log.num + 1 - A_Index)
break

if (end_str1 != "") {
; Тут нужна команда для удаления строчки (для справки, переменная end_str содержит в себе всю строчку).
} else {
}
return

В итоге из файла должна исчезнуть строчка:

Hex_Hex - Reason1

Не важно каким способом: редактирование файла, создание нового файла с удалением старого - разницы нет. Если вы можете мне помочь, то прошу вас сделать это.

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

2 (изменено: teadrinker, 2017-01-28 18:06:37)

Re: AHK: Удаление строки из текстового файла

text =
(
Text_Text - Reason
Hex_Hex - Reason1
)

search := "Hex_Hex - Reason1"

MsgBox, % RegExReplace(text, "(^|\R)\K\Q" . search . "\E(\R|$)")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: ypppu, 2017-01-28 18:29:31)

Re: AHK: Удаление строки из текстового файла

http://forum.script-coding.com/viewtopic.php?id=7750

4

Re: AHK: Удаление строки из текстового файла

Спасибо за предоставленную ссылку, red2881, там я нашел зацепку, как все сделать. Teadrinker, я ничего не понял из вашего кода, точнее последнюю строчку. А я не использую то, чего не понимаю. Но все равно спасибо за помощь.

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

5

Re: AHK: Удаление строки из текстового файла

belyankin12 пишет:

я ничего не понял из вашего кода, точнее последнюю строчку

А разве она не выдаёт требуемое?

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

6 (изменено: svoboden, 2017-01-28 20:00:02)

Re: AHK: Удаление строки из текстового файла

А так не проще сделать:

FileRead, OutputVar, A_ScriptDir "\file.txt"
StringReplace, FileName, OutputVar, Hex_Hex - Reason1,
FileDelete, A_ScriptDir "\file.txt"
FileAppend, %FileName%, A_ScriptDir "\file.txt"
return

7

Re: AHK: Удаление строки из текстового файла

belyankin12
Убрать строку в файле:

File := A_ScriptDir "\file.txt"
StrDel := "Hex_Hex - Reason1"

FileRead, All, % File
FileOpen(File, "w").Write(RegExReplace(All, "(^|\R)" . StrDel . "|" . StrDel . "(\R|$)"))

8

Re: AHK: Удаление строки из текстового файла

Вот так как коллега Flasher предлагает, как раз не надо (как и коллега svoboden).

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

9

Re: AHK: Удаление строки из текстового файла

Я сперва попробовал код коллеги teadrinker и увидел, что там не так, как надо.

10

Re: AHK: Удаление строки из текстового файла

Да ладно! Где?

text =
(
Text_Text - Reason
Hex_Hex \ Reason1
Text_Text - Reason
Text_Text - Reason
)

search := "Hex_Hex \ Reason1"

MsgBox, % RegExReplace(text, "(^|\R)\K\Q" . search . "\E(\R|$)")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Удаление строки из текстового файла

Да, есть косяк, не углядел. Правильно так:

text =
(
Text_Text - Reason
test Hex_Hex \ Reason1
Text_Text - Reason
Hex_Hex \ Reason1
)

search := "Hex_Hex \ Reason1"
patt := "^\Q" . search . "\E$"
MsgBox, % "|" RegExReplace(text, "m`a)\R" . patt . "|" . patt . "\R") "|"

Flasher, твой вариант:

All =
(
Hex_Hex - Reason1
Text_Text - Reason
Text_Text - Reason
Text_Text - Reason
)
StrDel := "Hex_Hex - Reason1"

MsgBox, % "|" RegExReplace(All, "(^|\R)" . StrDel . "|" . StrDel . "(\R|$)") "|"

Уж не говоря о:

All =
(
Hex_Hex \ Reason1
Text_Text - Reason
Text_Text - Reason
Text_Text - Reason
)
StrDel := "Hex_Hex \ Reason1"

MsgBox, % "|" RegExReplace(All, "(^|\R)" . StrDel . "|" . StrDel . "(\R|$)") "|"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Удаление строки из текстового файла

teadrinker, а что в моем варианте ни так?

13 (изменено: Malcev, 2017-01-28 21:19:02)

Re: AHK: Удаление строки из текстового файла

Можно так:

text =
(
Text_Text - Reason
test Hex_Hex \ Reason1
Text_Text - Reason
Hex_Hex \ Reason1
)

search := "Hex_Hex \ Reason1"
MsgBox, % "|" RegExReplace(text, "(^|\R)\Q" . search . "\E(\R|$)", $1$2) "|" 

Хотя нет.

14

Re: AHK: Удаление строки из текстового файла

svoboden

OutputVar =
(
Text_Text - Reason
Hex_Hex - Reason1
Text_Text - Reason
Text_Text - Reason
)

StringReplace, FileName, OutputVar, Hex_Hex - Reason1
MsgBox, % FileName

В этом примере пустая строка остаётся, а в этом

OutputVar =
(
Text_Text - Reason
test Hex_Hex - Reason1
Text_Text - Reason
Text_Text - Reason
)

StringReplace, FileName, OutputVar, Hex_Hex - Reason1
MsgBox, % FileName

вообще не то, что надо удаляется.

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

15

Re: AHK: Удаление строки из текстового файла

Malcev

text =
(
Text_Text - Reason
Hex_Hex \ Reason1
test Hex_Hex \ Reason1
Text_Text - Reason
)

search := "Hex_Hex \ Reason1"
MsgBox, % "|" RegExReplace(text, "(^|\R)\Q" . search . "\E(\R|$)", $1$2) "|" 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Удаление строки из текстового файла

Flasher, твой вариант:

Согласен.

Уж не говоря о:

Это было понятно. Спецсимволы не учитывал.

17

Re: AHK: Удаление строки из текстового файла

А что, текст без пустой строки должен быть?

18

Re: AHK: Удаление строки из текстового файла

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

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

19

Re: AHK: Удаление строки из текстового файла

belyankin12, ясно.

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

20 (изменено: teadrinker, 2017-01-31 18:31:52)

Re: AHK: Удаление строки из текстового файла

text =
(
Text_Text - Reason
Text_Text - Reason
Text_Text - Reason
Hex_Hex \ Reason1
)

search := "Hex_Hex \ Reason1"

MsgBox, % "|" RegExReplace(text, "(^|(\R))\Q" . search . "\E(?(2)(?=(\R|$))|\R)") "|"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21 (изменено: svoboden, 2017-02-01 16:03:53)

Re: AHK: Удаление строки из текстового файла

Кто знает, можно ли заменить или удалить строку без использования команд: FileDelete, FileAppend. Спасибо!

22

Re: AHK: Удаление строки из текстового файла

svoboden
Я же показывал.
Регулярку можно взять из примера выше.

23 (изменено: svoboden, 2017-03-11 04:20:00)

Re: AHK: Удаление строки из текстового файла

Flasher. а, ну да, переписывает. Спасибо.

24 (изменено: Malcev, 2023-12-13 20:54:16)

Re: AHK: Удаление строки из текстового файла

teadrinker пишет:
text =
(
Text_Text - Reason
Text_Text - Reason
Text_Text - Reason
Hex_Hex \ Reason1
)

search := "Hex_Hex \ Reason1"

MsgBox, % "|" RegExReplace(text, "(^|(\R))\Q" . search . "\E(?(2)(?=(\R|$))|\R)") "|"

Здесь кроется ошибка, сам на нее недавно наткнулся и какое-то время не мог понять в чем причина.
Когда мы используем такой шаблон как "\Q" search "\E", то надо строку конвертировать:

text =
(
Text_Text - Reason
Text_Text - Reason
Text_Text - Reason
Hex_Hex \E Reason1
)

search := "Hex_Hex \E Reason1"

MsgBox, % "|" RegExReplace(text, "(^|(\R))\Q" . search . "\E(?(2)(?=(\R|$))|\R)") "|"
MsgBox, % "|" RegExReplace(text, "(^|(\R))\Q" . literalRegex(search) . "\E(?(2)(?=(\R|$))|\R)") "|"

literalRegex(str)
{
   if InStr(str, "\E", 1)
   {
      StringCaseSenseOld := A_StringCaseSense
      StringCaseSense, On
      str := StrReplace(str, "\E", "\E\\E\Q")
      StringCaseSense, % StringCaseSenseOld
   }
   return str
}

25

Re: AHK: Удаление строки из текстового файла

Угу, чуть проще:

literalRegex(str)
{
    return RegExReplace(str, "\\E", "\E\\E\Q")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder