26 (изменено: migomigo, 2017-02-22 04:29:05)

Re: AHK: Сохранение Массива в файл

Пока что дело дальше этого не заходит.

+ открыть спойлер
Time_Limits_1 := "1570006"
	Time_Limits_2 := "10:30"
	Win_Counts_1 := "http://worldoftanks.ru" "`n" "Home - ROBLOX" "`n" "ok.ru"
	Win_Counts_2 := "ROBLOX" "`n" "WoT Client"
	Time_Counts_1 := "12"
	Time_Counts_2 := "3600000"
	
	
Loop ; Последовательно записываем в переменную "array_block .=" массив Time_Limits_[] разделяя строки "|и*"
{
	If !(Time_Limits_%A_Index%)
		break
	array_block .= "Time_Limits_" A_Index "|" Time_Limits_%A_Index% "*"
	array_block_Temp_1 .= "Time_Limits_" A_Index "|" Time_Limits_%A_Index% "*"   ; ==================== Сбор информации
}
Loop  ; Последовательно записываем в переменную "array_block .=" массив Win_Limits_[] разделяя строки "|и*"
{
	If !(Win_Counts_%A_Index%)
		break
	array_block .= "Win_Counts_" A_Index "|" Win_Counts_%A_Index% "*"
	array_block_Temp_2 .= "Win_Counts_" A_Index "|" Win_Counts_%A_Index% "*"    ; ==================== Сбор информации
}
Loop   ; Последовательно записываем в переменную "array_block .=" массив Time_Counts_[] разделяя строки "|и*"
{
	If !(Time_Counts_%A_Index%) {
		Time_Counts_%A_Index% := "..."
		array_block .= Time_Counts_%A_Index%
		break
	}
	array_block .= "Time_Counts_" A_Index "|" Time_Counts_%A_Index% "*"
	array_block_Temp_3 .= "Win_Counts_" A_Index "|" Win_Counts_%A_Index% "*"     ; ==================== Сбор информации 1
}

TL =
WC =
TC =

Loop, Parse, array_block, `*             ;============================================================= Распаковка - Этап 1
{
	If !(A_LoopField)
		continue
	Time_Limits_ .= A_LoopField "`n"
	Arrray_%A_Index% := A_LoopField
	Loop, parse, Arrray_%A_Index%, `|    ;============================================================= Распаковка - Этап 2
	{
		If !(A_LoopField)
		continue
		CCC++
		If (CCC = "2") {
			CCC := "0"
			if InStr(A_LoopField, "Time_Limits_" false)
			{
				TL++
				MsgBox, % Time_Limits_%TLC% := A_LoopField
				Report_ .= Time_Limits_ "`n" Time_Limits_%TLC% "`n"            ; ==================== Сбор информации 2
			}
			if InStr(A_LoopField, "Win_Counts_" True)
			{
				WC++
				MsgBox, % Win_Counts_%WC% := A_LoopField
				Report_ .= Win_Counts_ "`n" Win_Counts_%WC% "`n"            ; ==================== Сбор информации 2
			}
			if InStr(A_LoopField, "Time_Counts_" True)
			{
				TC++
				MsgBox, % Time_Counts_%TC% := A_LoopField
				Report_ .= Time_Counts_ "`n" Time_Counts_%TC% "`n"            ; ==================== Сбор информации 2
			}
		}			
	}
	
}


Gui, add, text, cRed, Блок №1:
Gui, add, Edit,, % array_block_Temp_1
Gui, add, text, cRed, Блок №2:
Gui, add, Edit,, % array_block_Temp_2
Gui, add, text, cRed, Блок №3:
Gui, add, Edit,, % array_block_Temp_3
Gui, add, text, cGreen, Запарсили массивы
Gui, add, Edit,, % array_block
Gui, add, text, cBlue, Распаковка - Этап 1
Gui, add, Edit,, % Time_Limits_
Gui, add, text, cBlue, Распаковка - Этап 2 (Тупик)
Gui, add, Edit,, % Report_
Gui, Show, 
return

GuiClose:
ExitApp
AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

27 (изменено: YMP, 2017-02-23 16:07:43)

Re: AHK: Сохранение Массива в файл

А не проще ли использовать INI-файл? Только `n на что-нибудь заменять при сохранении, а при загрузке вставлять обратно.


Time_Limits_1 := "1570006"
Time_Limits_2 := "10:30"
Win_Counts_1 := "http://worldoftanks.ru" "`n" "Home - ROBLOX" "`n" "ok.ru"
Win_Counts_2 := "ROBLOX" "`n" "WoT Client"
Time_Counts_1 := "12"
Time_Counts_2 := "3600000"

ArrayNames := ["Time_Limits", "Win_Counts", "Time_Counts"]
IniFile = %A_Temp%\SavedArray.txt
FileDelete, %IniFile%

; Сохранение
Loop, % ArrayNames._MaxIndex()
{
    SaveArray(ArrayNames[A_Index], IniFile)
}

; Загрузка
Loop, % ArrayNames._MaxIndex()
{
    LoadArray(ArrayNames[A_Index], IniFile)
}

; Проверка
Vars =
(
Time_Limits_1 = %Time_Limits_1%
Time_Limits_2 = %Time_Limits_2%
Win_Counts_1 = %Win_Counts_1%
Win_Counts_2 = %Win_Counts_2%
Time_Counts_1 = %Time_Counts_1%
Time_Counts_2 = %Time_Counts_2%
)
MsgBox, %Vars%

; ======================== Функции =====================================

SaveArray(Name, File)
{
    Loop {
        Key = %Name%_%A_Index%
        Value := %Key%
        If (Value = "") {
            Break
        }
        StringReplace, Value, Value, `n, |, A
        IniWrite, %Value%, %File%, Arrays, %Key%
    }
}

LoadArray(Name, File)
{
    Loop {
        Key = %Name%_%A_Index%
        IniRead, Value, %File%, Arrays, %Key%, %A_Space%
        If (Value = "") {
            Break
        }
        StringReplace, Value, Value, |, `n, A
        %Key% = %Value%
    }
}

28

Re: AHK: Сохранение Массива в файл

YMP
Идеально. То что надо! Спасибо. 
Не до конца понимаю механизм работы, но знаю как его применить..



Я правильно понимаю,

ArrayNames := ["Time_Limits", "Win_Counts", "Time_Counts"]

тут создается 3 массива?


MaxIndex()

А эта некая встроенная функция?

AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

29

Re: AHK: Сохранение Массива в файл

migomigo, а чем не устраивает IniWrite и IniRead? Какая польза от того, что все переменные сохраняются в одну строку?

30 (изменено: YMP, 2017-02-22 18:28:47)

Re: AHK: Сохранение Массива в файл

migomigo
Нет, создаётся один массив из трёх элементов, которыми являются названия ваших псевдомассивов. А _MaxIndex() — это метод массива, возвращающий максимальный задействованный в нём индекс элемента. В данном случае он равен числу элементов.

31 (изменено: migomigo, 2017-02-23 02:18:11)

Re: AHK: Сохранение Массива в файл

ypppu
Да в принципе ничем..
Сам не знаю чего я уцепился за FileAppend.

Вероятно, просто инерция..
Возможно, было желание понять как можно сделать скрипт сохранения массива в 1 файл сразу. 


IniWrite
IniRead

Полностью устраивают.

Уже всунул в скрипт пример от YMP, все замечательно работает.

Чуть позднее, как отшлифую функционал, выложу скрипт родительского контроля. Может одобрите..

AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

32

Re: AHK: Сохранение Массива в файл

YMP, у Вас используются команды IniWrite и IniRead. А зачем тогда усложнять ввод переменных

Win_Counts_1 := "http://worldoftanks.ru" "`n" "Home - ROBLOX" "`n" "ok.ru"

и внедрять символ конвейера в файле настроек? Вроде стандартными средствами более наглядно:

Win_Counts_1 = 
(
http://worldoftanks.ru
Home - ROBLOX
ok.ru
)

33

Re: AHK: Сохранение Массива в файл

ypppu
Переменные я просто скопировал из кода migomigo, они же чисто для примера. А замена новых строк нужна, чтобы потом из INI-файла нормально считалось.

34

Re: AHK: Сохранение Массива в файл

YMP, если в названии окна будет символ "|", то ваш код будет ошибочным.

Win_Counts_1 := "http://worldoftanks.ru" "`n" "Home | ROBLOX" "`n" "ok.ru"

35

Re: AHK: Сохранение Массива в файл

Malcev
Это только пример. Никто не запрещает использовать другой символ. Я ведь там написал: "Только `n на что-нибудь заменять при сохранении, а при загрузке вставлять обратно." На что-нибудь, а не на |.

36

Re: AHK: Сохранение Массива в файл

YMP пишет:

чтобы потом из INI-файла нормально считалось

YMP, точно, а считать такой ini-файл нормально я уже не смогу, разве что свою функцию писать.

37

Re: AHK: Сохранение Массива в файл

А можно использовать как разделитель, уникальную комбинацию символов?
Например:

№;%/\

Или что-то в этом роде?..

AutoHotKey Version: 1.1.09.02
Не спеши, а то успеешь..

38 (изменено: Malcev, 2017-02-23 16:32:46)

Re: AHK: Сохранение Массива в файл

YMP, в вашем коде обнуление переменных после сохранения не происходит, так что проверка бессмысленна.
Так, мне кажется, надежнее:

Time_Limits_1 := "1570006"
Time_Limits_2 := "10:30"
Win_Counts_1 := "http://worldoftanks.ru" "`n" "Home | ROBLOX" "`n" "ok.ru"
Win_Counts_2 := "ROBLOX" "`n" "WoT Client"
Time_Counts_1 := "12"
Time_Counts_2 := "3600000"



ArrayNames := ["Time_Limits", "Win_Counts", "Time_Counts"]
IniFile = %A_Temp%\SavedArray.txt
FileDelete, %IniFile%

; Сохранение
Loop, % ArrayNames._MaxIndex()
{
    SaveArray(ArrayNames[A_Index], IniFile)
}


; Обнуление
Time_Limits_1 = 
Time_Limits_2 = 
Win_Counts_1 = 
Win_Counts_2 = 
Time_Counts_1 = 
Time_Counts_2 = 


; Загрузка
Loop, % ArrayNames._MaxIndex()
{
    LoadArray(ArrayNames[A_Index], IniFile)
}

; Проверка
Vars =
(
Time_Limits_1 = %Time_Limits_1%
Time_Limits_2 = %Time_Limits_2%
Win_Counts_1 = %Win_Counts_1%
Win_Counts_2 = %Win_Counts_2%
Time_Counts_1 = %Time_Counts_1%
Time_Counts_2 = %Time_Counts_2%
)
MsgBox, %Vars%

; ======================== Функции =====================================

SaveArray(Name, File)
{
   Loop
   {
      Key = %Name%_%A_Index%
      Value := %Key%
      If (Value = "")
         Break
      Loop, Parse, value, `r`n
         IniWrite, %A_LoopField%, %File%, Arrays, %A_Index%|%Key%
   }
}

LoadArray(Name, File)
{
   Loop
   {
      Key = %Name%_%A_Index%
      loop
      {
         IniRead, Value, %File%, Arrays, %A_Index%|%Key%, %A_Space%
         If (Value = "")
         {
            if (Values = "")
               break 2
            %Key% = %Values%
            Values := ""
            break
         }
         If A_Index = 1
            values := value 
         else
            values .= "`n" value
      }
   }
}

39

Re: AHK: Сохранение Массива в файл

Malcev пишет:

YMP, в вашем коде обнуление переменных после сохранения не происходит, так что проверка бессмысленна.

Они перезаписываются функцией LoadArray. Да и вообще это чисто для демонстрации. Ясно же было, что migomigo проверит код в реальных условиях, т.е. запустит скрипт с уже существующим INI-файлом и посмотрит, как загрузились переменные.

40

Re: AHK: Сохранение Массива в файл

Пример на одномерный массив


B:= ["Ivan", 345, "London"]
Save("Test.txt", B)
Run, Test.txt
MsgBox, % "Continue"
C:= Load("Test.txt")
MsgBox, % "Size " C.MaxIndex() "`n" C[1] "`n" C[2] "`n" C[3] "`n"
ExitApp

Save(fName, ByRef A, dl := "|"){
	if FileExist(fName)
		FileDelete, % fName
	Loop, % A.MaxIndex()
		S.= A[A_Index] dl
	FileAppend, % Trim(S, dl), % fName
}

Load(fName, dl:= "|"){
	FileRead, S, % fName
	A:= []
	Loop, parse, S, % dl
		A[A_Index]:= A_LoopField
	return A
}

41 (изменено: YMP, 2017-02-23 16:09:48)

Re: AHK: Сохранение Массива в файл

migomigo пишет:

А можно использовать как разделитель, уникальную комбинацию символов?

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

Кстати, нужно заменить в обеих функциях If (!Value) на If (Value = ""), ведь в переменной, по идее, и ноль может быть, а это уже непустое значение.

42

Re: AHK: Сохранение Массива в файл

YMP пишет:

Они перезаписываются функцией LoadArray

Я этого не наблюдаю:

Time_Limits_1 := "1570006"
Time_Limits_2 := "10:30"
Win_Counts_1 := "http://worldoftanks.ru" "`n" "Home - ROBLOX" "`n" "ok.ru"
Win_Counts_2 := "ROBLOX" "`n" "WoT Client"
Time_Counts_1 := "12"
Time_Counts_2 := "3600000"

ArrayNames := ["Time_Limits", "Win_Counts", "Time_Counts"]
IniFile = %A_Temp%\SavedArray.txt
FileDelete, %IniFile%



; Загрузка
Loop, % ArrayNames._MaxIndex()
{
    LoadArray(ArrayNames[A_Index], IniFile)
}

; Проверка
Vars =
(
Time_Limits_1 = %Time_Limits_1%
Time_Limits_2 = %Time_Limits_2%
Win_Counts_1 = %Win_Counts_1%
Win_Counts_2 = %Win_Counts_2%
Time_Counts_1 = %Time_Counts_1%
Time_Counts_2 = %Time_Counts_2%
)
MsgBox, %Vars%

; ======================== Функции =====================================

SaveArray(Name, File)
{
    Loop {
        Key = %Name%_%A_Index%
        Value := %Key%
        If (!Value) {
            Break
        }
        StringReplace, Value, Value, `n, |, A
        IniWrite, %Value%, %File%, Arrays, %Key%
    }
}

LoadArray(Name, File)
{
    Loop {
        Key = %Name%_%A_Index%
        IniRead, Value, %File%, Arrays, %Key%, %A_Space%
        If (!Value) {
            Break
        }
        StringReplace, Value, Value, |, `n, A
        %Key% = %Value%
    }
}

43

Re: AHK: Сохранение Массива в файл

Malcev пишет:

Я этого не наблюдаю:

Естественно. Раз файла нет, то и загружать нечего.

44

Re: AHK: Сохранение Массива в файл

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

45

Re: AHK: Сохранение Массива в файл

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

46 (изменено: Malcev, 2017-02-23 16:23:44)

Re: AHK: Сохранение Массива в файл

Я тоже так понял.
Но также я понял, что проверку вы вставили для того, чтобы убедиться, что ini файл создан верно, все данные в него записались и все успешно загрузились.
А без обнуления перемнных, что нам эта проверка даёт?

47

Re: AHK: Сохранение Массива в файл

По крайней мере видно, что данные не портятся. А вообще, это больше рекламный ход. Сам я проверил другими средствами. С обнулением было бы правильно, но лень было его делать. В конце концов migomigo же разработчик, а не ламер какой-нибудь, всё проверит в деле.

48

Re: AHK: Сохранение Массива в файл

+ Offtop:

migomigo даже If Else не умеет использовать.

49

Re: AHK: Сохранение Массива в файл

Для многострочных переменных сделал функцию на замену IniRead и IniWrite. Вместо разделителя строки используется тег <linefeed> (можно любой другой подставить). Предлагаю в Коллекцию. Есть какие предложения / дополнения / критика?

Win_Counts_1 =
(
http://worldoftanks.ru Home - ROBLOX
ok.ru
)

MyIniWrite(Win_Counts_1, "Filename.ini", "Section", "Key")
MyIniRead(OutputVar, "Filename.ini", "Section", "Key", "MyError")
MsgBox, % OutputVar
Return

MyIniWrite(Value, Filename, Section, Key)
{
StringReplace, Value, Value, `n, <linefeed>, All
IniWrite, %Value%, %Filename%, %Section%, %Key%
}

MyIniRead(ByRef OutputVar, Filename, Section, Key, ByRef Default)
{
IniRead,  OutputVar, %Filename%, %Section%, %Key%, %Default%
StringReplace, OutputVar, OutputVar, <linefeed>, `n, All
}

50

Re: AHK: Сохранение Массива в файл

ypppu, а почему не хотите вообще без замен обойтись, как в 38 посте?