1

Тема: AHK v2: список сайтов из txt в json для Amnezia

; список сайтов из txt в json для Amnezia
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := StrReplace(sites, '.txt', '.json',, &OutputVarCount)
if OutputVarCount != 1 {
	MsgBox 'Недопустимое имя входного файла'
	ExitApp
}
indent1 := A_Space . A_Space
indent2 := indent1 . indent1
FileDelete sitesJson
Loop Read sites, sitesJson
	FileAppend (A_Index = 1 ? '[`n' : ',`n') . indent1 . '{`n' . indent2 . '"hostname": "' . A_LoopReadLine . '"`n' . indent1 . '}'
FileAppend '`n]', sitesJson
ExitApp

Для замечаний.

2

Re: AHK v2: список сайтов из txt в json для Amnezia

Подправил

; список сайтов из txt в json для Amnezia
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
indent1 := A_Space . A_Space
indent2 := indent1 . indent1
if FileExist(sitesJson)
	FileDelete sitesJson
Loop Read sites, sitesJson
	FileAppend (A_Index = 1 ? '[`n' : ',`n') . indent1 . '{`n' . indent2 . '"hostname": "' . A_LoopReadLine . '"`n' . indent1 . '}'
FileAppend '`n]', sitesJson
ExitApp

3

Re: AHK v2: список сайтов из txt в json для Amnezia

ещё поправил

; список сайтов из txt в json для Amnezia
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
indent1 := '`s`s', indent2 := indent1 . indent1
try	FileDelete sitesJson
Loop Read sites, sitesJson
	FileAppend (A_Index = 1 ? '[`n' : ',`n') . indent1 . '{`n' . indent2 . '"hostname": "' . A_LoopReadLine . '"`n' . indent1 . '}'
FileAppend '`n]', sitesJson
ExitApp

4

Re: AHK v2: список сайтов из txt в json для Amnezia

А в чём вопрос-то?

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

5

Re: AHK v2: список сайтов из txt в json для Amnezia

Особо вопроса нет. Думал, может кто ошибки укажет или предложит лучший вариант.
Вот ещё вариант

; список сайтов из txt в json для Amnezia
#Include <LightJson>
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
json := ''
Loop Read sites
	json .= (A_Index = 1 ? '[' : ',') . '{"hostname":"' . A_LoopReadLine . '"}'
json .= ']'
sitesJson := SubStr(sites, 1, -3) . 'json'
try	FileDelete sitesJson
FileAppend LightJson.Beautify(json, '    '), sitesJson
ExitApp

6

Re: AHK v2: список сайтов из txt в json для Amnezia

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

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

7 (изменено: haridev, 2026-02-12 12:59:32)

Re: AHK v2: список сайтов из txt в json для Amnezia

Так, наверно

; список сайтов из txt в json для Amnezia
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
try	FileDelete sitesJson
indent := '`s`s', indent2 := indent . indent
FileAppend '[`n' . indent . '{`n' . indent2 . '"hostname": "' . RegExReplace(RTrim(FileRead(sites, '`n'), '`n`s`t'), '`n', '"`n' . indent . '},`n' . indent . '{`n' . indent2 . '"hostname": "') . '"`n' . indent . '}`n]', sitesJson
ExitApp

или так

; список сайтов из txt в json для Amnezia
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
try	FileDelete sitesJson
indent := '`s`s', indent2 := indent . indent
FileAppend '[`n' . indent . '{`n' . indent2 . '"hostname": "'
. RegExReplace(RTrim(FileRead(sites, '`n'), '`n`s`t')
	, '`n', '"`n' . indent . '},`n' . indent . '{`n' . indent2 . '"hostname": "') . '"`n' . indent . '}`n]'
, sitesJson
ExitApp

8

Re: AHK v2: список сайтов из txt в json для Amnezia

Не следует много действий упаковывать в одну строку. Такое трудно читать и невозможно отлаживать.

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

9

Re: AHK v2: список сайтов из txt в json для Amnezia

Так, примерно?

; список сайтов из txt в json для Amnezia
if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
try	FileDelete sitesJson
indent := '`s`s', indent2 := indent . indent
s := RTrim(FileRead(sites, '`n'), '`n`s`t')
s := RegExReplace(s, '`n', '"`n' . indent . '},`n' . indent . '{`n' . indent2 . '"hostname": "')
s := ('[`n' . indent . '{`n' . indent2 . '"hostname": "') . s . ('"`n' . indent . '}`n]')
FileAppend s, sitesJson
ExitApp

10

Re: AHK v2: список сайтов из txt в json для Amnezia

Проще так:

if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
try FileDelete sitesJson
i := '`s`s'
s := Trim(FileRead(sites, '`n'), '`n`t`s')
s := RegExReplace(s, '\V+', i . '{`n' . i . i . '"hostname": $0`n' . i . '},')
s := '[`n' . RTrim(s, ',') . '`n]'
FileAppend s, sitesJson
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: haridev, 2026-02-13 12:37:49)

Re: AHK v2: список сайтов из txt в json для Amnezia

Отлично! Узнал про \V+, про "вертикальный пробел".
Добавил кавычки для имени сайта:

if !sites := FileSelect(1,, 'Список сайтов', 'Documents (*.txt)')
	ExitApp
sitesJson := SubStr(sites, 1, -3) . 'json'
try FileDelete sitesJson
i := '`s`s'
s := Trim(FileRead(sites, '`n'), '`n`t`s')
s := RegExReplace(s, '\V+', i . '{`n' . i . i . '"hostname": "$0"`n' . i . '},')
s := '[`n' . RTrim(s, ',') . '`n]'
FileAppend s, sitesJson

12

Re: AHK v2: список сайтов из txt в json для Amnezia

haridev пишет:

Узнал про \V+, про "вертикальный пробел"

Если что, \V — это как раз всё, кроме вертикального пробела, вертикальный пробел это \v.

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