alex_r
Новичок
- Сообщения
- 4
- Репутация
- 0
Помогите разобраться со следущей задачей. Имеется поток входных данных, в котором идет перечисление свойств нескольких предметов. Проблема в том, что некоторые из этих свойств для некоторых предметов могут опускаться, в этом случае предполагается это свойство принимает дефолтное значение. Каким образом это можно реализовать?
В идеале на выходе должны получится 3 массива - $aName, $aMassa, $aQuantity, все одинаковой размерности. Через регулярные выражения $aQuantity получается размером меньше чем два остальных, т.к. это свойство приведено не для всех предметов. С задачей можно справиться, если добавить дополнительный цикл, как в приведенном коде, но мне кажется это не очень оптимально.
Еще вопрос. Когда я делаю поиск $aGlobal, я вынужден терять данные об ID, т.к. если искать текст между ID\d{5} ... ID\d{5}, то подстроки находятся через раз. Приходится искать начиная с ~ и до ID следущего предмета. Каким образом это можно исправить, а то тут повезло, что ~ больше нигде не встречается.
В идеале на выходе должны получится 3 массива - $aName, $aMassa, $aQuantity, все одинаковой размерности. Через регулярные выражения $aQuantity получается размером меньше чем два остальных, т.к. это свойство приведено не для всех предметов. С задачей можно справиться, если добавить дополнительный цикл, как в приведенном коде, но мне кажется это не очень оптимально.
Код:
#include <Array.au3>
$sData = '</ID00001, ~name1",massa="1",q="10",ID00001,~name2",massa="5",q="20",ID00003,~name3",massa="100"/> ,еще какие то данные, где так же могут встречаться ID0000_i и name_i, но уже не так упорядочено'
;Декларативная часть всегда заканчивается тегом '/>'
;Символ ~ больше нигде, кроме как перед началом name_i не встречается, почему то в моих данных он используется в качестве открывающей кавычки и только в этом месте.
;названия и масса есть для всех предметов, количество не у всех. Где количество отсутствует, подразумевается 1.
$sPatternNames = '(?:~)(.+?)\"'
;$aPatternMassa= '(?:~.+?\",massa=\")(\d*)'
$sPatternMassa = '(?:massa=\")(\d*)'
$aNames = StringRegExp($sData, $sPatternNames, 3)
$aMassa = StringRegExp($sData, $sPatternMassa, 3)
_ArrayDisplay($aNames)
_ArrayDisplay($aMassa)
$sPatternGlobal = '(?:~)(.+?)(?:(?:,ID\d{5})|(?:/>))'
$aGlobal = StringRegExp($sData, $sPatternGlobal, 3)
_ArrayDisplay($aGlobal)
$sPatternQuantity = '(?:q=")(\d*)'
$iZ = UBound($aGlobal)
Dim $aQuantity[$iZ]
For $i = 0 To $iZ - 1
$aQ = StringRegExp($aGlobal[$i], $sPatternQuantity, 3)
If UBound($aQ) > 0 Then
$aQuantity[$i] = $aQ[0]
Else
$aQuantity[$i] = 1
EndIf
Next
_ArrayDisplay($aQuantity)
Еще вопрос. Когда я делаю поиск $aGlobal, я вынужден терять данные об ID, т.к. если искать текст между ID\d{5} ... ID\d{5}, то подстроки находятся через раз. Приходится искать начиная с ~ и до ID следущего предмета. Каким образом это можно исправить, а то тут повезло, что ~ больше нигде не встречается.