Что нового

Изменить порядок следования значений в файле конфигурации

Math

Новичок
Сообщения
85
Репутация
1
Делаю планировщик задач для программы, и не знаю как доделать одну функцию.

Смысл вот в чём. Есть ини файл, со списком заданий...

[General]
Tasks=N

[Task1]
Label=5
<параметры>

[Task2]
Label=5
<параметры>

[Task3]
Label=2
<параметры>

[TaskN]
Label=M
<параметры>

Заданий N. У каждого задания есть своя секция (которая называется "Task<номер задания>"), в которой записан параметр "Label", и другие параметры. Значение параметра "Label" от 1 до M.

И из этого списка, нужно сделать новый список.
В котором задания будут упорядочены согласно значению Label.
Т.е. например, есть N=8 и M=3:
Task1 - label=1
Task2 - label=1
Task3 - label=2
Task4 - label=2
Task5 - label=2
Task6 - label=2
Task7 - label=3
Task8 - label=3

Нужно сделать так:
Task1 - label=1
Task2 - label=2
Task3 - label=3
Task4 - label=1
Task5 - label=2
Task6 - label=3
Task7 - label=2
Task8 - label=2

Т.е получиться чередование заданий с разными значениями label.
При этом, в получившемся списке просто изменится порядок следования заданий и их имя.

Очень сумбурно всё описал, надеюсь на вашу помощь.
 

sngr

AutoIT Гуру
Сообщения
988
Репутация
393
Вы хотите сделать чередование с какой-то переодичностью?
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
sngr сказал(а):
Вы хотите сделать чередование с какой-то переодичностью?
Да, что бы задания с одинаковым значением label были как можно дальше друг от друга.
 

running-frag

why me?
Сообщения
441
Репутация
60
а в чём проблема? у тебя есть полный список TaskN - т.е. полный массив (как ты вытянешь его с ини это сейчас не важно, но это реально), после запускаем цикл и перезаписуем как тебе надо (твой пример выше)

я не понял в чём у тебя трудности?
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Как получить массив значений из ini-файла?
 

sngr

AutoIT Гуру
Сообщения
988
Репутация
393
Код:
#include 'array.au3'
$file=''
$ini=IniReadSectionNames($file)
Dim $arr[1]
For $i=1 To $ini[0]
	_ArrayAdd($arr,IniRead($file,$ini[$i],'key','no'))
Next
_ArrayDelete($arr,0)
_ArrayDisplay($arr)
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Тогда как получить массив состоящий из названия секции и значения?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Math,
Дайте пример ини-файла и скажите, в каком виде Вы хотите получить из него данные.
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Я переделал предыдущую функцию, и теперь можно немного упростить задачу.
Вот исходный файл:

[General]
Tasks=3

[Task1]
CreateList=C:\Storm\ini\CreateList\[44][ALL] StartThr.ini
EditList=C:\Storm\ini\EditList\[45] Part7.ini
TimeS=120
TimeE=1000

Start=3
End=5

Label=1

[Task2]
CreateList=C:\Storm\ini\CreateList\[12][ALL] StartThr2.ini
EditList=C:\Storm\ini\EditList\[24] Part8.ini
TimeS=20
TimeE=35

Start=1
End=3

Label=2

[Task3]
CreateList=C:\Storm\ini\CreateList\[45][ND] StartThr3.ini
EditList=C:\Storm\ini\EditList\[42] Part9.ini
TimeS=20
TimeE=45
Start=10
End=11

Label=3

Вот что нужно получить:
[General]
Tasks=8

[Task1]
CreateList=C:\Storm\ini\CreateList\[44][ALL] StartThr.ini
EditList=C:\Storm\ini\EditList\[45] Part7.ini
TimeS=120
TimeE=1000

Start=3
End=3

Label=1

[Task2]
CreateList=C:\Storm\ini\CreateList\[12][ALL] StartThr2.ini
EditList=C:\Storm\ini\EditList\[24] Part8.ini
TimeS=20
TimeE=35

Start=1
End=1

Label=2

[Task3]
CreateList=C:\Storm\ini\CreateList\[45][ND] StartThr3.ini
EditList=C:\Storm\ini\EditList\[42] Part9.ini
TimeS=20
TimeE=45
Start=10
End=10

Label=3

[Task4]
CreateList=C:\Storm\ini\CreateList\[44][ALL] StartThr.ini
EditList=C:\Storm\ini\EditList\[45] Part7.ini
TimeS=120
TimeE=1000

Start=4
End=4

Label=1

[Task5]
CreateList=C:\Storm\ini\CreateList\[12][ALL] StartThr2.ini
EditList=C:\Storm\ini\EditList\[24] Part8.ini
TimeS=20
TimeE=35

Start=2
End=2

Label=2

[Task6]
CreateList=C:\Storm\ini\CreateList\[45][ND] StartThr3.ini
EditList=C:\Storm\ini\EditList\[42] Part9.ini
TimeS=20
TimeE=45
Start=11
End=11

Label=3

[Task7]
CreateList=C:\Storm\ini\CreateList\[44][ALL] StartThr.ini
EditList=C:\Storm\ini\EditList\[45] Part7.ini
TimeS=120
TimeE=1000

Start=5
End=5

Label=1

[Task8]
CreateList=C:\Storm\ini\CreateList\[12][ALL] StartThr2.ini
EditList=C:\Storm\ini\EditList\[24] Part8.ini
TimeS=20
TimeE=35

Start=3
End=3

Label=2

Цветом выделил для наглядности.
Каждая задача из первого файла разбивается на более мелкие, согласно значениям Start и End.
И получившиеся задачи чередуются друг с другом согласно значениям Label.
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Выше описал. :smile:
И, например, в Task1 - Start=3, End=5, значит, получится три задачи с одинаковым значением параметров Start и End - это 3, 4, и 5.
 
Автор
M

Math

Новичок
Сообщения
85
Репутация
1
Тема решена.
Вряд ли кому-то, кроме меня, пригодится это решение:
Код:
$NewK = 0
			
IniWrite($TempINI, "General", "Tasks", "0")
IniWrite($TempINI, "General", "Check", $k)

For $i = 1 to $k
				
	$NewK = $NewK + Execute((IniRead($TaskINI, "Task"&$i, "EndCreate", "") - IniRead($TaskINI, "Task"&$i, "StartCreate", ""))+1)
				
	IniWrite($TempINI, "Task"&$i, "EditList", IniRead($TaskINI, "Task"&$i, "EditList", ""))
	IniWrite($TempINI, "Task"&$i, "CreateList", IniRead($TaskINI, "Task"&$i, "CreateList", ""))
	IniWrite($TempINI, "Task"&$i, "TimeS", IniRead($TaskINI, "Task"&$i, "TimeS", ""))
	IniWrite($TempINI, "Task"&$i, "TimeE", IniRead($TaskINI, "Task"&$i, "TimeE", ""))			
	IniWrite($TempINI, "Task"&$i, "StartCreate", IniRead($TaskINI, "Task"&$i, "StartCreate", ""))
	IniWrite($TempINI, "Task"&$i, "EndCreate", IniRead($TaskINI, "Task"&$i, "StartCreate", "") & @CRLF)
Next
		
	GUICtrlSetData($Tr,"Only Task - " & $NewK)
	IniWrite($TempINI, "General", "Tasks", $NewK)

For $s = 1 to $NewK
	For $i = 1 to $k
		If Execute(IniRead($TaskINI, "Task"&$i, "EndCreate", "") - IniRead($TaskINI, "Task"&$i, "StartCreate", "")) > 0 Then
			$RealCreate = Execute(IniRead($TaskINI, "Task"&$i, "StartCreate", "") + 1)
			IniWrite($TaskINI, "Task"&$i, "StartCreate", $RealCreate)
							
			$NewWrite = Execute(IniRead($TempINI, "General", "Check", "999")+1)
				IniWrite($TempINI, "General", "Check", $NewWrite)
					IniWrite($TempINI, "Task"&$NewWrite, "EditList", IniRead($TaskINI, "Task"&$i, "EditList", ""))
					IniWrite($TempINI, "Task"&$NewWrite, "CreateList", IniRead($TaskINI, "Task"&$i, "CreateList", ""))
					IniWrite($TempINI, "Task"&$NewWrite, "TimeS", IniRead($TaskINI, "Task"&$i, "TimeS", ""))
					IniWrite($TempINI, "Task"&$NewWrite, "TimeE", IniRead($TaskINI, "Task"&$i, "TimeE", ""))
								
					$nCreate = IniRead($TaskINI, "Task"&$i, "StartCreate", "")
						IniWrite($TempINI, "Task"&$NewWrite, "StartCreate", $nCreate)
						IniWrite($TempINI, "Task"&$NewWrite, "EndCreate", $nCreate & @CRLF)
		EndIf
	Next
Next
 
Верх