1 (изменено: blackgorod, 2021-04-14 10:14:53)

Тема: AHK: Удалить строку из файла и перезаписать его

Здравствуйте. Прошу помощи в реализации. Есть файл, в нем список
ааа
ббб
ввв
Как удалить первую строку и записать изменения в этот же файл?
Поискал по форуму, собрал код, но когда одна строка остается в файле, то он ее не удаляет

temp = file.txt
FileReadLine, line, %temp%, 1
If (line > "")
{
	MsgBox, %line%
	Loop, read, %temp%, tempfile.txt
		{
		   IfNotInString, A_LoopReadLine, %line%, FileAppend, %A_LoopReadLine%`n
		}
	FileMove, tempfile.txt, %temp%, 1
}
else
goto, label

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

2

Re: AHK: Удалить строку из файла и перезаписать его

FileMove
Перемещает или переименовывает один или несколько файлов.

  Можно записать новый файл с помощью

FileAppend
Добавляет текст к файлу (создавая файл при необходимости).

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

3

Re: AHK: Удалить строку из файла и перезаписать его

Foma Выше в примере как раз через FileMove работает , но только проблема с остающейся строкой. Еще вроде можно как то через FileOpen делать, но я плохо разбираюсь в AHK, хотя очень хотел бы научится писать скрипты. На данный момент хочется найти решение в виде небольшого кода, который можно будет вставлять в разные участки общего скрипта, да и проще будет разобраться как он работает.

4

Re: AHK: Удалить строку из файла и перезаписать его

blackgorod
Вам нужно сначала попытаться на словах алгоритм удаления строки сформулировать. Можете?

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

5

Re: AHK: Удалить строку из файла и перезаписать его

teadrinker Да, конечно, попробую. Мне нужно реализовать последовательное взятие строк из файла, с последующим их удалением.
Пример: Есть файл список.txt, в нем куча строк.  Нужен скрипт который  будет брать первую строку из файла, записывать эту строку в переменную (для дальнейшей работы), и эту строку сразу же удалять из файла как использованную. Когда строки закончатся то нужно выдать какую то мессагу. Я пробую найти минимально небольшой код для этих целей, т.к. сам код я буду очень часто использовать и вставлять его в различные участки уже своего большого скрипта.

6

Re: AHK: Удалить строку из файла и перезаписать его

Пока вот сделал такой вариант, наверное это колхоз, но короче не знаю как сделать. И есть проблема, почему то когда осталась одна строка в файле список.txt, то она не удаляется

file := "C:\список.txt"
FileReadLine, line, %file%, 1
FileRead, All, % File
FileOpen(File, "w").Write(RegexReplace(All, "^.*`r`n"))

7

Re: AHK: Удалить строку из файла и перезаписать его

blackgorod пишет:

и эту строку сразу же удалять из файла как использованную.

То-есть, алгоритм удаления строки — удалять строку?

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

8

Re: AHK: Удалить строку из файла и перезаписать его

teadrinker Считать первую строку строку из файла в переменную и удалить ее. Не совсем понимаю, что вы имеете ввиду под алгоритмом удаления строки? ) Ну то есть как пример, в файле строки:
аааа
бббб
вввв
После выполнения скрипта, должно остаться
бббб
вввв

9

Re: AHK: Удалить строку из файла и перезаписать его

ну вот как в примере выше у меня код он удаляет строки, только когда остается одна единственная строка в файле, она не удаляется

10

Re: AHK: Удалить строку из файла и перезаписать его

До тех пор, пока внятно не сможете объяснить на словах, что именно нужно сделать скрипту, чтобы удалить первую строку из файла, ожидать правильной работы не имеет смысла.

blackgorod пишет:

Не совсем понимаю, что вы имеете ввиду под алгоритмом удаления строки?

Я имею в виду тот набор действий, которые должен сделать скрипт, чтобы удалить первую строку. Именно первую, а не какую-то ещё. И именно строку, а не что нибудь другое.

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

11

Re: AHK: Удалить строку из файла и перезаписать его

teadrinker Вы троллите? Что именно непонятно для вас? Алгоритм удаления строки? Ну так это и есть решение вопроса. Алгоритм, т.е. решение я надеялся получить на данном форуме. Из файла с пятью строками, на выходе должен быть файл с 4 строками (первая строка удаляется) Что именно непонятно объясните?

12

Re: AHK: Удалить строку из файла и перезаписать его

blackgorod пишет:

Вы троллите?

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

blackgorod пишет:

Из файла с пятью строками, на выходе должен быть файл с 4 строками (первая строка удаляется)

Можно, например, читать файл построчно, все строки, кроме самой первой, добавлять в переменную. Так у вас получится текст без первой строки. Потом удаляете файл, и записываете заново с новым текстом. Теперь у вас есть алгоритм.

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

13 (изменено: blackgorod, 2021-04-14 15:40:12)

Re: AHK: Удалить строку из файла и перезаписать его

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

teadrinker пишет:

читать файл построчно, все строки, кроме самой первой, добавлять в переменную. Так у вас получится текст без первой строки

А можно ли увидеть пример воочию? читать файл построчно с помощью Loop? А нельзя ли более проще как то реализовать, вот допустим как в этом коде что я приводил раньше

file := "C:\список.txt"
FileReadLine, line, %file%, 1
FileRead, All, % File
FileOpen(File, "w").Write(RegexReplace(All, "^.*`r`n"))

Через filereadline я получаю первую строку, что мне и нужно, по сути только нужно эту строку удалить, команда FileRead понятна, но вот последняя команда FileOpen не совсем ясна, идет запись в файл с применением регулярного выражения. Где и что режется что подменяется это непонятно для меня. ^.*`r`n это поиск сначала строки до перевода строки. Но в любом случае скрипт работает, пока не остается одна лишь строка. Вот эта единственная строка не удаляется, можно ли одной строкой кода ее удалить?

14

Re: AHK: Удалить строку из файла и перезаписать его

Я лично всегда открывал файл целиком, считывал его данные и пока с ним работаю ничего не сохранял обратно - зачем лишний раз использовать чтение / запись с диска? Тем более когда строк много это лишний износ.
В ситуации когда файл будет использоваться несколькими программами / скриптами, тогда имеет ещё смысл открывать-сохранять постоянно. Но почему бы тогда не решать задачу в одной программе?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: Удалить строку из файла и перезаписать его

__Михаил__ Ну потому что работа идет не одним скриптом, а несколькими, запуск скриптов будет производится внешней программой. В реальности там все гораздо сложнее, этот самый файл со списком, будет являться копией оригинального файла. То есть изначально через команду sort будет перемешиваться список, затем создаваться копия этого списка, помещаясь в папку temp, а затем по порядку брать строки с удалением до победного, эти самые строки будут брать различные скрипты. После того как файл список.txt обработается будет пауза, затем снова копирование списка из оригинала, перемешивание и снова взятие строки с удалением до победного и так по кругу. Поэтому и нужна запись в файла, но суть заключается в том, чтобы этот самый файл был растерзан другими скриптами до победного

16

Re: AHK: Удалить строку из файла и перезаписать его

Тогда легче думаю сделать один главный скрипт. Он будет напрямую в остальные кидать нужные строки на обработку, через этот же главный делать основные действия с копированием файла (если оно так нужно).

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

17

Re: AHK: Удалить строку из файла и перезаписать его

__Михаил__ Главного нет, там все смешалось в кучу, bas, кликер, ahk скрипты. Каждый скрипт делает свою задачу. работает скажем со своей папкой а значит и со своим списком, через несколько секунд уже другая папка становится главной и с ней работает другая рабочая пара скриптов. Ну в теории это пока так, а на практике много кода выходит, причем корявого. Поэтому я лишь хочу совета, лучше всего если это будет готовый пример. Как переделать (и можно ли) чтобы данный код

file := "C:\список.txt"
FileReadLine, line, %file%, 1
FileRead, All, % File
FileOpen(File, "w").Write(RegexReplace(All, "^.*`r`n"))

удалял оставшуюся единственную строку из файла? Либо есть есть альтернативный вариант чтения и удаления строк, то подскажите. Единственное не хочется чтобы код был большим громоздким. Потому что скриптов много и кусок кода будет вставляться в разные участки скрипта и разных скриптов. Буду очень благодарен за пример. Я собственно пришел спросить совета можно ли это лаконично и кратко реализовать, в ahk я разбираюсь плохо, но я учусь и на готовом примере я быстрее соображу что и как работает.

18 (изменено: teadrinker, 2021-04-14 19:14:37)

Re: AHK: Удалить строку из файла и перезаписать его

Попробуйте так:

file := "C:\список.txt"
FileReadLine, line, % file, 1
FileRead, All, % file
FileOpen(file, "w").Write(RegexReplace(All, "^\V*\R?"))

Не проверял.

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

19

Re: AHK: Удалить строку из файла и перезаписать его

Зачем вставлять один и тот же рабочий участок кода во все свои скрипты? Можно и нужно для этого сохранить как *.ahk скрипт в виде функции / метки, затем переместить в библиотеку, из которой будет использоваться во всех скриптах.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

20

Re: AHK: Удалить строку из файла и перезаписать его

Зачем держать кучу отдельных файлов в разных папках? Можно все нужное для работы скрипта держать в одном файле и копировать всего 1 файл при переносе на другой ПК и не думать о других файлах которые где-то должны лежать.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

21

Re: AHK: Удалить строку из файла и перезаписать его

__Михаил__Alectric Мне сложно вам объяснить всю цепочку и последовательность скриптов. Ну представьте что есть куча разных папок, в каждой есть свои уникальные скрипты, в каждом идет работа со своим списком, у каждой папке есть так называемые свои собственные черные и белые списки которая относится к конкретной лишь папке. Можно конечно таскать скрипт и через A_ScriptDir будет браться текущий список из текущей папке, либо создать отдельный скрипт для работы со списками, или даже функцию и сделать один глобальный скрипт, но это невозможно. Я обо всем этом подумал. Там каждый скрипт делает некие уникальные действия, у каждого свои таймауты выполнения. Скрипты запускаются внешними программами. Если можно было сделать так как вы описали, поверьте я бы так и сделал, где то нужна рандомизация списка, где то не нужна, где то нужно брать строку и записывать ее в текущую папку в другой файл где лежит список, а где этого не нужно делать. В каких то скриптах будет сравниваться списки, чистятся дубли, в каких то нет.

22

Re: AHK: Удалить строку из файла и перезаписать его

teadrinker Сработало!! Удаляет единственную строку как и требуется. Я счастлив! Если несложно, объясните:
1) Что значит \V и \R
2) Какой язык регулярных выражений использует AHK?
Просто я с регулярками нечасто сталкивался, в основном в других софтах, у меня стоит RegexBuggy, я в ней тестирую/составляю рег. выражения. Но \V  и \R он красным выделил, то есть не понимает. Есть выбор языков, перебрал все, тоже красным подсвечивает. Не понимаю. А хочется понять как это выражение работает. Либо может подскажите где об этом почитать?

23

Re: AHK: Удалить строку из файла и перезаписать его

AHK использует Perl-compatible regular expressions.

\v     any vertical white space character
\V     any character that is not a vertical white space character

Outside a character class, by default, the escape sequence  \R  matches
any  Unicode newline sequence.

Про \R написано и в справке AHK.
Тестировать можно здесь, если разобраться, как оно работает.

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

24 (изменено: blackgorod, 2021-04-15 11:31:55)

Re: AHK: Удалить строку из файла и перезаписать его

teadrinker Спасибо, более менее понятно стало. Значит поиск идет от невертикального разделителя,  то есть собственно начало любой строки, и до \R, т.е. до перевода строки. А \R это любой разделить, хоть \r хоть \n хоть \r\n. Если я все верно конечно понял. Про невертикальный разделитель впервые узнал. Спасибо вам за помощь!
И про Perl тоже очень полезная информация, а то я все в JavaScript языке тестировал регулярки

25

Re: AHK: Удалить строку из файла и перезаписать его

blackgorod пишет:

Про невертикальный разделитель впервые узнал

Почему вы это называете разделителем? Это просто любой символ, кроме символа переноса строки.

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

26

Re: AHK: Удалить строку из файла и перезаписать его

teadrinker Я так в гугле прочитал ) Ну видимо неправильно воспринял информацию. Принцип работы регулярного выражения теперь полностью для меня понятен. Копилка знаний пополнилась. Еще раз спасибо!