Что нового

[Массивы] Как организовать быстрый поиск в текстовом файле ?

vaf

Новичок
Сообщения
186
Репутация
2
Добрый день уважаемые, встала задача найти в текстовом файле совпадение

И так есть текстовый файл с разделителями , в котором содержатся уникальные значения (пример под спойлером)

apx;128129130131132133134135138139140141142143144145146147150151152155156157
tim;127128129130131132133136137141142143144145146147148149150151152153154155
xray;128129130133134135138139140141142146147148149150151152153157158164165
ady;128129130131132133134135138139140141142143144145146147151152158159160
vag;127128134135136139140141142143144145146149150151152153154155156157158
rec;128129130131135136137138139140141142143144147148149150151152153154
wild;127128133134135136141142145146150151155156157158159160161162163164
flex;127128129130131132136137141142143144145146147148149153154158159160
tsk;127128129130131132133135136137138139140141142143146147148152153154
ryjuk;128129130131135136143144147148149152153154160161165166170171172
dip;128129130131132133134135136140141145146147148149150151152153154
tsk;127128129130131132135136137138139140141142143146147148152153154
tsk;127128129130131132133135136137138139140141142143147148152153154
laur;128129133134135136137138139140143144145151152156157158159160
ice;128129133134135136137138139140143144145146147148149150151152
risk;128129130131135136139140141142143144145146147151152156157158
niki;128129130131132133134135136139140144145146149150151152155156
fury;127128129130131132136137143144145148149150151152156157163164
sin;127128129130131132133134138139143144145146147148149150151152
yup;128129135136140141147148149152153154155156157158159160161
isc;128129132133134135136137138139143144145146147148149150151
zyk;127128129130131132133134135137138139145146150151155156157
elly;128129130131132133134135136139140144145146149150157158
vaf;127128134135136139140141142143144145146149150151152153
titi;127128129130131132133136137140141142143144145146149150
elly;128129130131132133134135136139140144145149150157158
tia;127128129130131132133136137141142143144145146147148
rin;128129130131135136140141142143144145146147148149
jin;128129132133134137138139140141142143144145146
uri;128129135136140141142143144147148149

Нужно найти первое попавшееся значение, к примеру 127128129130131132133135136137138139140141142143147148152153154 и вывести его имя
Заранее спасибо за помощ
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
$str = "127128129130131132133135136137138139140141142143147148152153154"
$text = FileReadToArray(@ScriptDir & "\text.txt")
If Not @error Then
  For $i = 0 To UBound($text) - 1
    If StringInStr($text[$i], $str) Then
      $name = StringLeft($text[$i], StringInStr($text[$i], ";") - 1)
      MsgBox(0, "", $name)
      Exit
    EndIf
  Next
EndIf
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
в таком виде не работает, а что нужно подключать чтобы FileReadToArray работало ?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А вот мой вариант:
Код:
#include <array.au3>;          _ArrayDisplay
Global $sText, $aVs, $sPattern, $sResult

$sText = fileread("2.txt");     читаем текст из файла 2.txt

$sPattern = "(?si)[a-zA-Zа-яА-ЯёЁ;]+([0-9a-zA-Z]+)"
$aVs = StringRegExp($sText, $sPattern, 3)
If @error Then
MsgBox(16, "error", "Not found. Error code: "&@error)
Exit
EndIf
_ArrayDisplay($aVs)

; найти определённое значение
$sStr = "127128129130131132133136137141142143144145146147148149150151152153154155"
For $i = 1 To UBound($aVs)-1
If StringInStr($aVs[$i], $sStr) Then
$sResult = $aVs[$i]
ExitLoop
EndIf
Next
If $sResult <> "" Then
MsgBox(64, "Найденное значение", $sResult)
Else
MsgBox(64, "Значение не найдено", "В файле нет искомой строки")
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vaf [?]
в таком виде не работает
Это для версии AutoIt 3.3.10.2 :smile:

А это для 3.3.8.1
Код:
#include <File.au3>

Global $text[1]

$str = "127128129130131132133135136137138139140141142143147148152153154"
_FileReadToArray(@ScriptDir & "\text.txt", $text)
If Not @error Then
  For $i = 0 To UBound($text) - 1
    If StringInStr($text[$i], $str) Then
      $name = StringLeft($text[$i], StringInStr($text[$i], ";") - 1)
      MsgBox(0, "", $name)
      Exit
    EndIf
  Next
EndIf
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
Оформил в виде функции, очень удобно получилось. search (искомое значение, имя файла), на выходе найденное значение

Код:
Func search($znach, $files)
   Global $text[1]

   $str = $znach
   _FileReadToArray(@ScriptDir & "\" & $files, $text)
   If Not @error Then
	  For $s = 0 To UBound($text) - 1
		 If StringInStr($text[$s], $str) Then
			$name = StringLeft($text[$s], StringInStr($text[$s], ";") - 1)
			Return $name
			Exit
		 EndIf
	  Next
   EndIf
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vaf [?]
Код:
Func search($znach, $files)
   Local $text[1]
   _FileReadToArray(@ScriptDir & "\" & $files, $text)
   If Not @error Then
      For $s = 1 To $text[0]
         If StringInStr($text[$s], $znach) Then Return StringLeft($text[$s], StringInStr($text[$s], ";") - 1)
      Next
   EndIf
   Return SetError(@error, 0, "")
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вариант :
Код:
$sText=ClipGet(); ($sText=FileRead($sFile))
$sSearch='127128129130131132133135136137138139140141142143147148152153154'
$sResult=StringRegExpReplace($sText,'(?sm).*?(^[^;]+);' & $sSearch & '.*', '${1}')
If Not @extended Then $sResult= 'Фрагмент не найден'
MsgBox(0,'$sResult', $sResult)
 
Верх