1

Тема: AHK: Замена в файле символов с конкретными координатами

Здравствуйте. Есть текстовый файл (конфиг приложения Sumatra PDF). В нём содержатся данные о цвете (HEX). Эти данные находятся на одном и том же месте, занимая одинаковое количество символов (6). Но символы всегда разные.
Нужен скрипт, позволяющий заменять символы, находящиеся по конкретным координатам (строка №_, символ №_; или символ №_ от начала).
Поиск по запросу "замена конкретного символа в текстовом файле ahk" в гугле ничего нужного не дал (или я не умею составлять запросы).

2 (изменено: stealzy, 2020-09-19 04:42:31)

Re: AHK: Замена в файле символов с конкретными координатами

Поиск можно начать в справке по документации. Поскольку оперировать нужно над текстом, который попадает в тип данных String, то раскроем этот раздел в содержании слева. Далее тыкаем в разные команды, смотрим что они делают. Операция выделения структуры в тексте называется парсингом, и тут как раз есть команда Loop (parse a string), она позволяет разделять текст по частям. То, что нужно. Чтобы найти строку применим разделение по строкам, а чтобы найти символ — разделение по символам (Конкретно в вашем случае можно просто заменить всю строку целиком). Готовые примеры берем оттуда же.
Еще понадобятся команды чтения и записи в файл.

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

3

Re: AHK: Замена в файле символов с конкретными координатами

stealzy пишет:

Конкретно в вашем случае можно просто заменить всю строку целиком

Как? Я не нашёл такую команду

4

Re: AHK: Замена в файле символов с конкретными координатами

Lortrum

Приведите примеры, как выглядит текст и что именно нужно найти. Чем подробней тем лучше.

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

5

Re: AHK: Замена в файле символов с конкретными координатами

__Михаил__
Текст:

# For documentation, see https://www.sumatrapdfreader.org/settings/settings3.2.html

MainWindowBackground = #141414
EscToExit = false
ReuseInstance = false
UseSysColors = false
RestoreSession = true
TabWidth = 300

FixedPageUI [
TextColor = #929292
BackgroundColor = #141414
SelectionColor = #f5fc0c
WindowMargin = 2 4 2 4
PageSpacing = 4 4
]
EbookUI [
FontName = Georgia
FontSize = 12.5
TextColor = #929292
BackgroundColor = #141414
UseFixedPageUI = false
]

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

6

Re: AHK: Замена в файле символов с конкретными координатами

Lortrum

Пример текста в файле - есть.
Что дальше? Пример замены чего на что? Минимум вариантов, только конкретная цель.

Если верно понял:
Найти '#929292' заменить на '#113399'.

Или как-то иначе?

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

7

Re: AHK: Замена в файле символов с конкретными координатами

__Михаил__

Извините, забыл сказать про это.

__Михаил__ пишет:

Найти '#929292' заменить на '#113399'.

Почти так и есть - заменить 6 символов, следующих после "#" на любые другие символы латинского алфавита и числа, обозначающие цвета в кодировке HEX.

Может быть вы всё-таки знаете команду по замене строки с конкретным номером в конкретном текстовом файле?

8 (изменено: teadrinker, 2020-09-28 01:29:58)

Re: AHK: Замена в файле символов с конкретными координатами

text =
(
# For documentation, see https://www.sumatrapdfreader.org/settings/settings3.2.html

MainWindowBackground = #141414
EscToExit = false
ReuseInstance = false
UseSysColors = false
RestoreSession = true
TabWidth = 300

FixedPageUI [
TextColor = #929292
BackgroundColor = #141414
SelectionColor = #f5fc0c
WindowMargin = 2 4 2 4
PageSpacing = 4 4
]
EbookUI [
FontName = Georgia
FontSize = 12.5
TextColor = #929292
BackgroundColor = #141414
UseFixedPageUI = false
]
)

lineIndex := 11
charIndex := 14
charsNumber := 6
replacement := "123456"

MsgBox, % newText := ReplaceText(text, lineIndex, charIndex, charsNumber, replacement)

ReplaceText(text, lineIndex, charIndex, charsNumber, replacement) {
   Return RegExReplace(text, "([^\v]*\R){" . lineIndex - 1 . "}.{" . charIndex - 1 "}\K.{" . charsNumber . "}", replacement,, 1)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Замена в файле символов с конкретными координатами

teadrinker

Пытался искать через шаблон ' = #(.+)\R' - в онлайн версии находит, в АХК нет, фиг знает что не так делаю...

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

10

Re: AHK: Замена в файле символов с конкретными координатами

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

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

11 (изменено: __Михаил__, 2020-09-28 01:30:17)

Re: AHK: Замена в файле символов с конкретными координатами

teadrinker

Пробовал таким способом:

File = Текст.txt
FileRead, Text, % File
If ErrorLevel
{
 MsgBox, Файл %File% не найден!
 Return
}

RegExMatch(Text, " = #(.+)\R", Found)

MsgBox % Found1
MsgBox % Found2
MsgBox % Found3

Идея была найти, и если есть заменить через 'StringReplace' найденное на необходимое. Но скрипт находит лишь первое совпадение в тексте.
Хотя на онлайн-сайте всё находит верно.

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

12

Re: AHK: Замена в файле символов с конкретными координатами

__Михаил__ пишет:
File = Текст.txt
FileRead, Text, % File

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

Text =
(
# For documentation, see https://www.sumatrapdfreader.org/settings/settings3.2.html

MainWindowBackground = #141414
EscToExit = false
ReuseInstance = false
UseSysColors = false
RestoreSession = true
TabWidth = 300

FixedPageUI [
TextColor = #929292
BackgroundColor = #141414
SelectionColor = #f5fc0c
WindowMargin = 2 4 2 4
PageSpacing = 4 4
]
EbookUI [
FontName = Georgia
FontSize = 12.5
TextColor = #929292
BackgroundColor = #141414
UseFixedPageUI = false
]
)
RegExMatch(Text, " = #(.+)\R", Found)
MsgBox, % Found1
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Замена в файле символов с конкретными координатами

Из файла находит, потому что там перенос строки `r`n, а точка не может соответствовать такому переносу без опции s (dot all). Но нам точно неизвестно, какой перенос строк на самом деле. Поэтому лучше сделать подшаблон .+ нежадным .+?

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

14

Re: AHK: Замена в файле символов с конкретными координатами

Извините за длительное отсутствие. Были дела.

teadrinker пишет:

lineIndex := 11
charIndex := 14
charsNumber := 6

Где это можно найти? Я не видел подобных команд в документации по AHK. Не видел, чтобы в документации было написано, что такие команды можно использовать.

15

Re: AHK: Замена в файле символов с конкретными координатами

В приведённой вами цитате нет ни одной команды, там есть только переменные, которым присваиваются значения. Первая — номер строки, вторая — номер символа в строке, с которого начинается часть текста, которую нужно заменить, третья — длина текста.

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

16

Re: AHK: Замена в файле символов с конкретными координатами

teadrinker пишет:

ReplaceText


Что это за команда? Я искал, но нашёл только другие команды.

17

Re: AHK: Замена в файле символов с конкретными координатами

Такой команды нет, это вызов функции, которая описана в этом же скрипте.

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