Что нового

Парсинг текста и вывод информации в виде таблицы

StarWash

Новичок
Сообщения
27
Репутация
0
Версия AutoIt: 3.3.6, могу обновить если надо.

Описание:

В файле много текста, такого вида:

Код:
<td class="dotted" style="" height="20">Name1 / bla-bla-bla /
                                Value 1 / bla-bla-bla</td>
<td class="dotted" style="" height="20">Name2 / bla-bla-bla /
                                Value 2 / bla-bla-bla</td>
<td class="dotted" style="" height="20">Name3 / bla-bla-bla /
                                Value 3 / bla-bla-bla</td>

Надо чтобы программа искала Name, далее:
В случае успеха искала Value и парсила его номер - в первом случае это 1, далее если этот номер больше или равен заданному нами, то выводила положительный результат (о том как должен выглядеть результат - далее), если нет то отрицательный.
В случае отсутствие строки, выводила отрицательный результат.

Примечания:

Результат должен иметь вид:

1 - Name1 - 1 - 1 - True
2 - Name2 - 5 - 2 - False
------------------------------ (кое-где желательно, чтобы можно было отделять разделителями типа такого)
3 - Name3 - 1 - 6 - True

Первый условный столбец - номер значения которое мы искали, типа приоритет.
Второй столбец - имя которое мы искали.
Третий столбец - минимально нужное нам значение, которые мы вписываем сами.
Четвертый - значение, которое было найдено.
Пятый - Труе, если четвертый больше или равно третьего значения, и Фалсе, если меньше.

Заранее всем спасибо! И всем + к карме :smile:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Как-то так: :smile:
Код:
#include <Array.au3>
#include <IE.au3>
Global $oIE, $oTable, $oTds, $oTd
Global $sText = "", $sResult = "", $iName = 0, $iValue = 0, $sName = "", $sValue = "", $iNum = 0;, $aNums, $sAllData = "", $sDelimiter = ""
$oIE = _IECreate(@ScriptDir & "\1index.html")
$oTable = $oIE.document.getElementsByTagName("table").item(0)
If IsObj($oTable) Then
	$oTds = _IETagNameGetCollection($oTable, "td")
	If IsObj($oTds) Then
		$iCount = 1
		Global $aNums[3] = [1, 5, 1]
		$sAllData = ""
		$sDelimiter = "-----------------------------"
		For $oTd In $oTds
			$sText = $oTd.innerTEXT
			$aResName = StringRegExp($sText, "(?si).*?([a-z]+.*?([0-9])).*?", 3)
			$aResValue = StringRegExp($sText, "(?si).*?\/.*?\/.*?([a-z]+.*?([0-9])).*?", 3)
			If IsArray($aResName) Then
				$sName = $aResName[0]
				$iName = $aResName[1]
			Else
				$sName = ""
				$iName = 0
			EndIf
			If IsArray($aResValue) Then
				$sValue = $aResValue[0]
				$iValue = $aResValue[1]
			Else
				$iValue = 0
			EndIf
			$iNum = $aNums[$iCount - 1]
			$sResult = $iCount & " - " & $sName & " - " & $iNum & " - " & $iValue & " - "
			If $iValue >= $iNum Then $sResult &= "True"
			If $iValue < $iNum Then $sResult &= "False"
			$sAllData &= String($sResult & @CRLF & $sDelimiter & @CRLF)
			;MsgBox(4096, "name, value and result", StringFormat("name: %s;     value: %s\r\nresult: %s\r\n", $iName, $iValue, $sResult))
			$iCount += 1
		Next
		$sText = ""
		$aRes = 0
		$sAllData = StringReplace($sAllData, $sDelimiter, "", -1); убрать последний разделитель после которого ничего нет
	EndIf
EndIf
MsgBox(4096, "All data", $sAllData)
; Sleep(100)
; _IEQuit($oIE)
Только я ни как не пойму вот это:
Перечитал несколько раз но не могу понять логику...


Добавлено:
Сообщение автоматически объединено:

HTML код при котором скрипт работает:
Код:
<!DOCTYPE HTML>
<html>
 <head>
  <meta charset="utf-8">
  <title>tst1 parse table</title>
 </head>
 <body>  
<TABLE>
<td class="dotted" style="" height="20">Name1 / bla-bla-bla /
                                Value 1 / bla-bla-bla</td>
<td class="dotted" style="" height="20">Name2 / bla-bla-bla /
                                Value 2 / bla-bla-bla</td>
<td class="dotted" style="" height="20">Name3 / bla-bla-bla /
                                Value 3 / bla-bla-bla</td>
</TABLE>
 </body>
</html>
 

xaker

Знающий
Сообщения
52
Репутация
16
Еще можно и так попробовать :
Код:
Global $aNums[3] = [1, 5, 1], $sMsg = '', $text = StringRegExp( FileRead(@ScriptDir & "\index.html"),'(?si).*?<td .*?>(.*?) /.*?([0-9]+) /.*?</td>',3)
For $i = 0 To (UBound($text))/2 - 1
	$sMsg &= $i+1 & ' - ' & $text[$i*2] & ' - ' & $aNums[$i] & ' - ' & $text[$i*2+1] & ' - ' & Check( $aNums[$i], $text[$i*2+1]) & @CRLF & '-------------------------' & @CRLF
Next
MsgBox(4096, '', $sMsg)

Func Check( $var1, $var2)
	If $var2 >= $var1 Then Return 'True'
	Return 'False'
EndFunc
 
Верх