Что нового

[Массивы] цикл, поиск-сравнение в многомерном массиве.

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Добрый день, нужна помощь, не хватает знаний и логики, как реализовать поиск в многомерном массиве? Нужна реализация: есть массив $ab[10] [2] который заполняется из файла *.txt который содержит такого вида текст
;20.04.85-->00.18.32
;04.05.06-->04.08.08
;20.04.86-->00.18.31
;00.18.32-->01.01.01
;00.18.33-->01.01.02
;00.18.31-->01.01.03
;01.01.01-->04.05.06
;01.01.08-->04.06.08
;
Код:
$damp = FileRead ('1.txt')
	$adress = 20.04.85 ; <<ищем в массиве
	$mas_damp_2= StringRegExp ($damp, '(?si)\;(.*?)\-\-\>', 3)
	
For $i= 0 To UBound ($mas_damp_2)  -1
	$ab [$i][0] = $mas_damp_2 [$i]
$rstring = $rstring &$mas_damp_2 [$i]
Next

$mas_damp_4 = StringRegExp ($damp, '(?si)\-\-\>(.*?);', 3)
For $i= 0 To UBound ($mas_damp_4)  -1
	$ab [$i][1] = $mas_damp_4 [$i]
$rstring_3 = $rstring_3 &$mas_damp_4 [$i]&@CRLF
Next
_ArrayDisplay ($ab)
MsgBox (0, "2", $rstring_3)
$otvet = $adress

For $i = 0 To UBound ($ab) - 1
	Select
	Case $adress = $ab [$i][0]
		$adress = $ab[$i][1]
		$otvet = $otvet & '-->'& $adress
		Case $adress <> $ab [$i][0]
	EndSelect
Next
MsgBox (0, '3', $otvet)



в общем нужна реализация того, чтоб после нахождения первой ячейки, переменной, бралось значение с соседней ячейки $ab [1][2] и искалось опять в первой и так пока не дайдет до конца, в моем случае должен быть ответ
20.04.85-->00.18.32-->01.01.01-->04.05.06-->04.08.08
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
$REZ = "" ;~ В ДАННОЙ ПЕРЕМЕННОЙ БУДЕТ РЕЗУЛЬТАТ

Local $file = FileOpen("test.txt", 0) ;~ открываем файл на чтение
	If $file = -1 Then
		MsgBox(0, "Error", "Unable to open file.")
		Exit
	EndIf
;~ -------------------------------- поиск из файла начиная с первой строки
Local $line1 = FileReadLine($file, 1) ;~ читаем первую строчку
	FileSetPos($file, 0, 0)
	$DMP_2 = StringRegExp ($line1, '\;(.*?)\-\-\>', 3);~ запоминаем первый элемент
	$DMP_2 = $DMP_2[0]
;~ --------------------------------	поиск из переменной
;~ 	$DMP_2 = '20.04.85'
;~ --------------------------------
	$REZ &= $DMP_2 ;~ записываем в результат
While 1
    Local $line = FileReadLine($file);~ читаем файл по линиям
    If @error = -1 Then ExitLoop;~ пока не конец файла - если конец - выйти
	$DMP = StringInStr($line, ';'&$DMP_2&'-->');~ ищем в строке по образцу второго элемента
	If $DMP Then;~ если нашли такой образец
		$DMP_2 = StringRegExpReplace ($line, '.*?\>', '');~ берем из строки второй элемент
		$REZ &= "-->"&$DMP_2;~ записываем результат
		FileSetPos($file, 0, 0);~ переводим позицию указателя файла в начало
	EndIf
WEnd
FileClose($file);~ закрываем файл

ConsoleWrite($REZ&@CRLF);~ выводим результат

ЗЫ: чуть исправил...
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Вот спасибо!!! А я в дебри полез...
А как эту же задачу решить через массив?
(для самообразования, просто интересно)
 

xaker

Знающий
Сообщения
52
Репутация
16
вот через массив:
Код:
#include <Array.au3>

ConsoleWrite(_Pars("test.txt") & @CRLF)

Func _Pars($File)
	Local $Array1 = StringRegExp(FileRead($File), '(\d{2}\.\d{2}\.\d{2})-->(\d{2}\.\d{2}\.\d{2})', 4), $Array2[UBound($Array1)][2]
	For $i = 0 To UBound($Array1) - 1
		$aLine = $Array1[$i]
		$Array2[$i][0] = $aLine[1]
		$Array2[$i][1] = $aLine[2]
	Next
	Local $Search = $Array2[0][1], $sResult = $Array2[0][0] & '-->' & $Array2[0][1], $iIndex
	While 1
		$iIndex = _ArraySearch($Array2, $Search, 0, 0, 0, 0, 0, 0)
		If $iIndex = -1 Then Return $sResult
		$Search = $Array2[$iIndex][1]
		$sResult &= '-->' & $Array2[$iIndex][1]
	WEnd
EndFunc   ;==>_Pars

а вот по другому, и в несколько раз быстрее:
Код:
ConsoleWrite(_Pars3("test.txt") & @CRLF)

Func _Pars3($File)
	Local $Text = FileRead($File), $aSearch[1] = [StringMid($Text, 2, 8)], $sResult = $aSearch[0]
	While 1
		$aSearch = StringRegExp ( $Text, $aSearch[0] & '-->(\d{2}\.\d{2}\.\d{2})', 3)
		If @error = 1 Then Return $sResult
		$sResult &= '-->' & $aSearch[0]
	WEnd
EndFunc
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Век живи-век учись...
Спасибо!!!
 
Верх