Что нового

[Массивы] Функция для пользовательськой категоризации входящего масива

konokrad666

Новичок
Сообщения
22
Репутация
0
Версия AutoIt: 3.3.8.1

Описание: Нужно сделать функцию, на входе она получает массив: никнейм пользователя и набор параметров, на основании этих параметров и правил пользователя она возвращает массив: название категории к которой относится никнейм и идентификатор категории. Названия категорий/их идентификаторы функция берет из .ini файла. Нужно сделать, чтобы пользователь мог создавать/ редактировать/ удалять правила для категоризации, путем редактирования .ini или через GUI.

Примечания:

Функция как есть сейчас, для конфигурации нужно редактировать исходники:
OffTopic:
Код:
Func GetCategory($param1, $param2, $param3, $param4) 
   Local $category[2]
Select
        Case $param1 = 0 Then
      $category[0] = "Категория 1"
      $category[1] = IniRead($config_path, "labels", $category[0], -1) ; читает идентификатор категории
      return $category

    Case $param1 >= 250 And $param1 < 500 And $param4 >= 52 Then
         $category[0] = "Категория 1"
         $category[1] = IniRead($config_path, "labels", $category[0], -1)
         return $category

    Case $param1 >= 250 And $param2 < 500 And $param3 < 52 Then
         $category[0] = "Категория 3"
         $category[1] = IniRead($config_path, "labels", $category[0], -1)
         return $category

   Case Else 
         $category[0] = "Категория 4"
         $category[1] = IniRead($config_path, "labels", $category[0], -1)
         return $category
EndSelect


Пример правила (наверное сделать через .ini чтобы потом было удобно прикрутить GUI):
Код:
категория1={название параметра1/>=40/<50}{название параметра2/=0}
категория2={название параметра1/>455/<=500}{название параметра3/=88}{название параметра4/<5}
категория3={else}
но на самом деле формат записи правил может быть другой, важно чтобы оно было более-менее читаемо

.ini файл с категориями и айди:
Код:
[labels]
Категория1=10
Категория2=12
Категория3=1
Категория4=7

Заранее спасибо.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Re: [Массивы] Написать функцию для

Мой вариант:

Код:
категория1={param1/>=40/<50}{param2/=0}
категория2={param1/>455/<=500}{param3/=88}{param4/<5}

Код:
Func GetCategory($param1, $param2, $param3, $param4)
	Local $_sRead = FileRead( @ScriptDir & '\' & 'config.cfg' )
	Local $_aRead = StringRegExp( $_sRead, '^(\w+)=(.*+)', 3 )
	Local $u = UBound( $_aRead ) / 2, $Idx, $Idx2, $Idx3

	Local $_cArray[2], $_tArray, $_sCategory, $_aIfs, $_sVar, $_bResult
	For $Idx = 1 To $u Step 1
		$_sCategory = $_aRead[($Idx-1)*2] ;Название категории

		$_aIfs = StringRegExp( $_aRead[(($Idx-1)*2)+1], '^(\{[^\}]+\})+', 3 )
		For $Idx2 = 0 To UBound( $_sIfs ) - 1 Step 1
			$_aIfs[$Idx2] = StringTrimRight( StringTrimLeft( $_aIfs[$Idx2], 1 ), 1 )

			$_tArray = StringSplit( $_aIfs[$Idx2], '/' )
			If IsArray( $_tArray ) And $_tArray[0] >= 2 Then
				$_sVar = StringRegExp( $_tArray[1], 'param[1234]', 3 )
				If IsArray( $_sVar ) Then
					For $Idx3 = 2 To $_tArray[0] Step 1
						$_bResult = Execute( '( Eval(' & $_sVar[0] & ') ' & $_tArray[$Idx3] & ' )'
						If $_bResult Then
							If $Idx3 = $_tArray[0] Then _
								ExitLoop
						Else
							$_bResult = False
							ExitLoop
						EndIf
					Next
				EndIf
			EndIf
			If Not $_bResult Then
				ExitLoop
			Else
				$_cArray[0] = $_sCategory
				$_cArray[1] = IniRead($config_path, "labels", $_cArray[0], -1)

				Return $_cArray
			EndIf
		Next
	Next

	Return SetError( 1, 0, 0 )
EndFunc


Обновлено.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Массивы] Написать функцию для

konokrad666,
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Массивы] Написать функцию для " - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.
 

XpycT

Скриптер
Сообщения
380
Репутация
133
konokrad666
Еще вариант
Код:
Global $sXML = @ScriptDir & "\rules.xml"

; Category1
$aCat = GetCategory(45, 0)
_ArrayDisplay($aCat, "Категория1")

; Category2
$aCat = GetCategory(460, Null, 88, 5)
_ArrayDisplay($aCat, "Категория2")

Func GetCategory($_iP1, $_iP2 = Null, $_iP3 = Null, $_iP4 = Null)
	Local $oXML = ObjCreate("Msxml2.DOMDocument"), $fSuccess = False, $aRet[2]

	$oXML.Load($sXML)

	$oCategories = $oXML.SelectNodes("categories/category")
	If $oXML.ParseError.ErrorCode <> 0 Then
		ConsoleWrite("! XML Error Reason  : " & $oXML.ParseError.Reason)
		ConsoleWrite("! XML Error Line    : " & $oXML.ParseError.Line & @CR)
		ConsoleWrite("! XML Error LinePos : " & $oXML.ParseError.LinePos & @CR)
		ConsoleWrite("! XML Error Texts   : " & $oXML.ParseError.srcText & @CR)
		Exit
	EndIf

	For $oCategory In $oCategories
		$sRule = $oCategory.GetAttribute("rule")

		$sRule = StringReplace($sRule, "(", "Eval('")
		$sRule = StringReplace($sRule, ")", "')")
		$sRule = StringReplace($sRule, "+", ">")
		$sRule = StringReplace($sRule, "-", "<")

		$fSuccess = Execute($sRule)

		If $fSuccess Then
			$aRet[0] = $oCategory.GetAttribute("name")
			$aRet[1] = $oCategory.GetAttribute("label")
			ExitLoop
		EndIf
	Next

	$oXML = Null

	Return $aRet
EndFunc


Правила храниться не в .ini, а в .xml файле.

Знак "больше" (>) заменяется знаком "плюс" (+), а знак "меньше" заменяется знаком "минус" (-)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
XpycT,
Вы написали бы, начиная с какой beta-версии AutoIt Ваш скрипт должен работать, или сделали бы проверку в скрипте.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да! XpycT, выглядит всё красиво как в сказке. Но не того...
К тому же ТС использует условия ">", ">=", "<", "<=", а не только ">" и "<".
Как быть?
 
Автор
K

konokrad666

Новичок
Сообщения
22
Репутация
0
Мне больше нравится вариант firex, пользователю будет затруднительно редактировать .xml, осталось только разобраться досконально как он работает, и поменять названия переменных для удобства пользователей c param1..12 на конкретные названия параметров.
 
Верх