Что нового

Простой телефонный справочник

chaos-13

Новичок
Всем привет. Идея такая. Есть файл xls с номерами телефонов компании. Хочу для себя сделать мини телефонный справочник, чтобы когда звонили мне, я не открывал Excel и там не искал, а было бы окошко созданное в AutoIT, где я бы мог ввести номер и определить по нему ФИО, телефон и отдел звонившего мне абонента. Да многие скажут, зачем мне всё это, когда есть готовые программы. Объясняю, делаю для себя и в целях изучения AutoIT. Так вот, хочу спросить советов. Моя идея по тому, как это будет реализовано выглядит так.

Сам файл с телефонами имеет структуру состоящую из 3-х столбцов (это столбец "ФИО", "Номер телефона", "Отдел") и 300 (примерно) строк. Планирую сделать форму окна, с кнопкой "найти" и полем для ввода номера телефона, ну и ввода ФИО( потому что вдруг просто захочу посмотреть телефон конкретного человека). В ней же, в этой форме сделать строки для вывода полученной информации.

Моя идея алгоритма( если она не лучшая, то подкиньте идей):
Загнать каждый столбец в отдельный массив ФИО, Номер телефона, Отдел, содержащий в себе значения. При вводе номера телефона в окно программы и по нажатию кнопки "найти" значение номера телефона присваивается переменной, которая будет поочерёдно сравниваться на равенство с каждым элементом массива "Номера телефонов". Если переменная и элемент массива окажутся равны, то выводим в соответствующую строку формы окна значение элемента массива "Номер телефона", а также с этим же индексом значение элементов массивов "ФИО" и "Отдел" и получаем результат.
Прошу дельный советов по оптимизации или может есть другой подход к этому.
 

joiner

Модератор
Локальный модератор
навскидку, можно все записать в строку в обычный txt файл
Код:
 ФИО,Телефон,Отдел
 ФИО,Телефон,Отдел
 ФИО,Телефон,Отдел
 ФИО,Телефон,Отдел
считать файл в массив
Код:
FileReadToArray

использовать функцию
Код:
StringInStr

для поиска в массиве.
результаты поиска вписывать в ListView
можно даже сделать живой поиск, чтобы искало, к примеру, после введения в строку поиска двух символов.
ввели номер телефона 458796
в строке появилось ФИО, Телефон,Отдел
и сделать возможность добавлять новые имена , телефоны
 

pvnn

Осваивающий
В свое время делал так:
1. Создать базу данных SQLite
2. Поместить данные из xls в таблицу SQLite
3. Создать форму с ListView и Input
При вводе части данных в Input производить поиск SQL-запросом и выводить в ListView:
Код:
Select * from table1 where field1 like %Value
* У меня было 70000 записей, все их невозможно было отобразить в ListView
Поэтому пришлось ограничить вывод в ListView по 2000 записей SQL-запросом
 

Вложения

Автор
C

chaos-13

Новичок
Спасибо за идей). Буду думать. Про возможность добавления в планах. Интересует вопрос быстродействия поиска. т.к. в моём варианте чувствуется, что массивы долго формируются, перед тем, как сравнивать переменную со значениями одного из этих массивов.
 

edyapd

Осваивающий
Что значит "долго формируется"?
Если у вас есть уже готовый файл в Excel, то можно просто его считывать в массив
Код:
$aData = _ExcelReadSheetToArray($oExcel)

И потом искать номер телефона, к примеру в первом столбце, а связаную с ним информацию во втором и третьем.
OffTopic:
Хотя моё мнение, для этого лучше подошло бы My Visual Database. У них даже пример есть как сделать телефонный справочник. А для изучения AutoIT можно много других задач, для которых он лучше подходит, найти.
 

alex33

Скриптер
А не легче открыть файл с номерами и через поиск (CTRL + F / F3 , найти) вписать туда телефон / фио?
Примерно так:
 

AZJIO

Меценат
Меценат
chaos-13
вариант 1. Делаешь список. Ничего не надо загонять в массив. Обычное регулярное выражение ищет номер в текстовом списке и вытаскивает всю строку на вывод в GUI. Делаешь три регулярных выражения, а задействуется в зависимости от того какое поле заполнено. Быстрый запуск программы в отношении к поиску.
вариант 2. Экспорт данных в массив. Медленнее запуск, но быстрее поиск. двумерный массив с тремя колонками. Быстрота за счёт проверки по одной колонке.
вариант 3. Экспорт в словарь или использование Assing. Ещё более быстрее поиск. Но более сложно.
вариант 4. База данных. Не советую для небольшого количества данных. Требует изучения SQL, увеличивается размер программы заметно, требует функционал для правки данных. Да и база предназначена для динамического взаимодействия, а не для поиска по статическому списку (как на самолёте за хлебом)
Хотя для 300 строк все варианты будут достаточно быстры, а способов решения несколько.

Вывод обязательно с возможностью вывода нескольких вариантов, на случай одно-фамильцев. Можно сделать функционал проверки списка, чтобы исключить дублирование телефонов в одном списке. Функционал проверки строк не соответствующих формату (к примеру в именах кириллицы есть англ. буквы, такие как a, c, o, p и т.д., потому что поиск не выведет данных). При поиске сделать поиск с вариантами +7 и 8 одновременно, чтобы исключить этот недостаток.

В общем идея интересная, не сложная. Начинай делать мы поможем с регулярными выражениями.
 
Автор
C

chaos-13

Новичок
AZJIO сказал(а):
chaos-13
вариант 1. Делаешь список. Ничего не надо загонять в массив. Обычное регулярное выражение ищет номер в текстовом списке и вытаскивает всю строку на вывод в GUI. Делаешь три регулярных выражения, а задействуется в зависимости от того какое поле заполнено. Быстрый запуск программы в отношении к поиску.
вариант 2. Экспорт данных в массив. Медленнее запуск, но быстрее поиск. двумерный массив с тремя колонками. Быстрота за счёт проверки по одной колонке.
вариант 3. Экспорт в словарь или использование Assing. Ещё более быстрее поиск. Но более сложно.
вариант 4. База данных. Не советую для небольшого количества данных. Требует изучения SQL, увеличивается размер программы заметно, требует функционал для правки данных. Да и база предназначена для динамического взаимодействия, а не для поиска по статическому списку (как на самолёте за хлебом)
Хотя для 300 строк все варианты будут достаточно быстры, а способов решения несколько.

Вывод обязательно с возможностью вывода нескольких вариантов, на случай одно-фамильцев. Можно сделать функционал проверки списка, чтобы исключить дублирование телефонов в одном списке. Функционал проверки строк не соответствующих формату (к примеру в именах кириллицы есть англ. буквы, такие как a, c, o, p и т.д., потому что поиск не выведет данных). При поиске сделать поиск с вариантами +7 и 8 одновременно, чтобы исключить этот недостаток.

В общем идея интересная, не сложная. Начинай делать мы поможем с регулярными выражениями.
Вот я как раз выбрал первый вариант. Использую регулярные выражения. Конкретно функции StringInStr и StringRegExp. Пока смотрю отличие между ними. Кто может разницу их применения подсказать? Для себя пока склоняюсь к применению ф-ции StringRegExp, она находит совпадение, но пока вопрос как вывести именно значение этого совпадения на экран, потому как ф-ция выводит значение 1, если совпадение найдено и значение 0, если не найдено.


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

alex33 сказал(а):
А не легче открыть файл с номерами и через поиск (CTRL + F / F3 , найти) вписать туда телефон / фио?
Примерно так:
Возможно и легче, но для меня вопрос стоит в том, чтобы попутно изучить возможности языка AutoIT.
 

joiner

Модератор
Локальный модератор
я бы выбрал второй вариант. долгая загрузка программы это относительная условность. заметна ли разница в десятую доли секунды?. к тому же, запустить программу достаточно один раз и не выгружать. а там уже поиск в массиве. важны две колонки - ФИО и телефон. В какой колонке искать - зависит от того, что ищешь. Быстрый поиск. Массив выгружать не нужно. Добавляем запись - добавляется строка в файл и в массив. или наоборот - удаляем, те же действия.
уже где-то упоминал, что писал программу для работы - поиск моделей принтеров и запчастей к ним. записи хранятся в обычном txt. примерно 14 000 строк. не заметил каких либо затруднений или замедления работы программы. один раз загрузил базу в массив и работаю. загрузка базы занимает меньше секунды.
 

AZJIO

Меценат
Меценат
chaos-13
Вот накидал побыстрому. Слегка потестил, на Linux не так то удобно это делать.
Код:
$sText = FileRead(@ScriptDir & '\список.txt')

$hGui = GUICreate('My Program', 500, 360)

$iBtn = GUICtrlCreateButton('Поиск', 10, 10, 120, 22)

$iTel = GUICtrlCreateInput('', 5, 44, 130, 17)
$iFIO = GUICtrlCreateInput('', 140, 44, 210, 17)
$iData = GUICtrlCreateInput('', 360, 44, 130, 17)

$iOut = GUICtrlCreateEdit('', 5, 74, 450, 107)

$iStatusBar = GUICtrlCreateLabel('StatusBar', 5, 360 - 20, 495, 17)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $iBtn
			$sTel = GUICtrlRead($iTel)
			$sFIO = GUICtrlRead($iFIO)
			$sData = GUICtrlRead($iData)
			GUICtrlSetData($iStatusBar, 'Этап 1')
			Switch True
				Case $sTel
					$aRes=StringRegExp($sText, '(?m)^(' & $sTel & ')\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h([А-яЁё]+?)\r?$', 3)
				Case $sFIO
					; $aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h(' & $sFIO & ')\h([А-яЁё]+?)\r?$', 3)
					$aRes=StringRegExp($sText, '(?m)^(.*?)(' & $sFIO & ')(.*?)\r?$', 3)
				Case $sData
					$aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h(' & $sData & ')\r?$', 3)
				Case Else
					MsgBox(0, 'Пусто', 'Пусто')
					ContinueLoop
			EndSwitch
			; $aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h([А-яЁё]+?)\r?$', 3)
			If @error Then ; Проверка ошибки ОБЯЗАТЕЛЬНА. Данная проверка для StringRegExp
				GUICtrlSetData($iStatusBar, 'Не найдено')
			Else
				; _ArrayDisplay($aRes, "флаг=3") ; функция для просмотра массива
				For $i = 0 To UBound($aRes)-1 Step 3
					$sOut = $aRes[$i] & ' ' & $aRes[$i + 1] & ' ' & $aRes[$i + 2] & @CRLF
				Next
				GUICtrlSetData($iOut, $sOut)
				GUICtrlSetData($iStatusBar, 'Выполнено')
			EndIf
		Case -3
			Exit
	EndSwitch
WEnd


1. Где ваш пример файла списка телефонов с вымышленными данными?
2. Где ваш пример кода который не получается? Ну то есть GUI, пример функций, ничего.
Вам надо помогать или делать всё за вас?


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

joiner
Правильно, второй вариант лучший. Во первых поиск быстрее, меньше регулярных выражений придумывать (одно для начального анализа и отправки в массив). В потом сделать галочку искать полное вхождения или части, чтобы не вводить полностью, а только фамилию и получить список даже нескольких вариантов


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

Вариант с массивом - см. ниже, исправлено.
 
Автор
C

chaos-13

Новичок
Пока код написан не полностью, я нахожусь ещё на стадии разработки, ещё в процессе обучаюсь, но за ваши идей огромнейшее спасибо)). По структуре файла со списками телефонов это будет *.txt.
Выглядит он примерно так:

Иванов Иван Иванович 99-99-99 начальник отдела кадров
Петров Пётр Петрович 88-88-88 сотрудник отдела кадров
.............................................................................................
и т.д.

Вот сам код:
Код:
#include<File.au3>
#include<Array.au3>
#include<WindowsConstants.au3>
#include<GUIConstantsEx.au3>
#include<ButtonConstants.au3>
Global $Button_1, $hGUI, $Telnumb, $FIO, $Telnumb_2, $FIO_2, $POD, $msg, $aRecords, $i, $asResult
$hGUI=GUICreate("Кто звонил???",520,200,-1,-1,$WS_OVERLAPPEDWINDOW + $WS_POPUP)
$Telnumb=GUICtrlCreateInput("",64,30,90); поле для ввода номера телефона
$FIO=GUICtrlCreateInput("",64,70,170); поле для ввода ФИО
GUICtrlCreateLabel("Ном.тел.:",7,30)
GUICtrlCreateLabel("Ф.И.О:",5,70)
$Button_1=GUICtrlCreateButton("Найти",50,140,80)
$Telnumb_2=GUICtrlCreateInput("",330,30,90); поле для вывода номера телефона
$FIO_2=GUICtrlCreateInput("",330,70,170); поле для вывода ФИО
GUICtrlCreateLabel("Результат",400,7)
GUICtrlCreateLabel("Здесь пишем того, кого хотим найти",35,7)
GUICtrlCreateLabel("Ном. тел.:",5,30)
GUICtrlCreateLabel("Ф.И.О:",5,70)
GUICtrlCreateLabel("Ф.И.О:",270,70)
GUICtrlCreateLabel("Ном. тел.:",270,30)
GUICtrlCreateLabel("Отдел:",240,120)
$POD=GUICtrlCreateInput("",330,120,90); поле для вывода Отдела
GUISetState(@SW_SHOW,$hGUI)

While 1
   $msg=GUIGetMsg()
   Switch $msg
   Case $Button_1
	   $sTelnumb=GUICtrlRead($Telnumb,0)
	   $sFIO=GUICtrlRead($FIO,0)
	     If Not _FileReadToArray(@ScriptDir&"\phones.txt", $aRecords) Then
			MsgBox(4096, "Ошибка","Ошибка чтения файла в массив  Ошибка=" & @error)
			Exit
		 EndIf
		For $i=1 To $aRecords[0]
         	$asResult=StringRegExp($aRecords[$i],$sTelnumb,1)
			ConsoleWrite('  -> Error code: ' & @error & @CRLF)
			ConsoleWrite('  -> Extented: ' & @extended & @CRLF)
			MsgBox(0,"Результат", $asResult[0] & "," & $asResult[1])
         Next
   Case $GUI_EVENT_CLOSE
	  ExitLoop
   EndSwitch
WEnd

GUIDelete($hGUI)



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

Код выдаёт ошибку в 39 строке. Вот сейчас разбираюсь пока с этим.
 

joiner

Модератор
Локальный модератор
chaos-13 [?]
Код выдаёт ошибку в 39 строке. Вот сейчас разбираюсь пока с этим.
ошибку выдает потому, что нет массива, а ты не проверяя на существование массива уже выводишь в сообщение данные. их нет, а значит ошибка
можно использовать нативную функцию
Код:
FileReadToArray; 3.3.12.0

если все ж используешь _FileReadToArray, то прочитай внимательно справку
 
Автор
C

chaos-13

Новичок
Всё-таки у меня вариант номер 2, а не 1, как я говорил выше. Т.к. я использую массив, загоняю в него содержимое txt файла и хочу с помощью регулярного выражения найти результат и вывести строку теперь уже в List View наверное, а не как у меня в коде по отдельности.
 

joiner

Модератор
Локальный модератор
походу, эта тема для раздела "проекты". а не для раздела "новичков". много вопросов будет по ходу создания справочника.
 

AZJIO

Меценат
Меценат
chaos-13
На ещё для твоего списка
Код:
#include <Array.au3>

; _________________________________
$sText = FileRead(@ScriptDir & '\phones.txt')
; $aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h([А-яЁё]+?)\r?$', 3)
$aRes=StringRegExp($sText, '(?m)^([А-яЁё]+?\h+[А-яЁё]+?\h+[А-яЁё]+?)\h+(\d\d-\d\d-\d\d)\h+([А-яЁё\h]+?)\r?$', 3)
If @error Then ; Проверка ошибки ОБЯЗАТЕЛЬНА. Данная проверка для StringRegExp
	MsgBox(0, 'Пусто', 'Проблема с файлом')
Else
	$u = UBound($aRes)
	$u2 = $u / 3
	Local $aRes2D[$u2][3]
	$d = 0
	For $i = 0 To $u - 1 Step 3
		$aRes2D[$d][0] = $aRes[$i]
		$aRes2D[$d][1] = $aRes[$i + 1]
		$aRes2D[$d][2] = $aRes[$i + 2]
		$d += 1
	Next
EndIf
$sOut = ''
; _ArrayDisplay($aRes2D) ; функция для просмотра массива
; _________________________________

$hGui = GUICreate('Кто звонил???', 500, 250)

GUICtrlCreateLabel("Ном.тел.:",5, 24, 130, 17)
GUICtrlCreateLabel("Ф.И.О:", 140, 24, 210, 17)
GUICtrlCreateLabel("Отдел / Должность",360, 24, 130, 17)
$iTel = GUICtrlCreateInput('', 5, 44, 130, 22)
$iFIO = GUICtrlCreateInput('', 140, 44, 210, 22)
$iData = GUICtrlCreateInput('', 360, 44, 130, 22)

GUICtrlCreateLabel("Результат", 5, 74, 490, 107)
$iOut = GUICtrlCreateEdit('', 5, 94, 490, 90)

$iBtn = GUICtrlCreateButton('Поиск', 390, 200, 90, 28)

$iStatusBar = GUICtrlCreateLabel('В базе ' & $u2 & ' телефонов', 5, 250 - 20, 495, 17)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $iBtn
			$sTel = GUICtrlRead($iTel)
			$sFIO = GUICtrlRead($iFIO)
			$sData = GUICtrlRead($iData)
			GUICtrlSetData($iStatusBar, 'Этап 1')
			Switch True
				Case $sTel
					$col = 1
					$sSearch = $sTel
				Case $sFIO
					$col = 0
					$sSearch = $sFIO
				Case $sData
					$col = 2
					$sSearch = $sData
				Case Else
					MsgBox(0, 'Пусто', 'Пусто')
					ContinueLoop
			EndSwitch
			$iCount = 0
			For $i = 1 To $u2 - 1
				If StringInStr($aRes2D[$i][$col], $sSearch) Then
					$sOut &= $aRes2D[$i][0] & ' ' & $aRes2D[$i][1] & ' ' & $aRes2D[$i][2] & @CRLF
					$iCount += 1
				EndIf
			Next
			If $sOut Then
				GUICtrlSetData($iOut, $sOut)
				GUICtrlSetData($iStatusBar, 'Найдено ' & $iCount)
				$sOut = ''
			Else
				GUICtrlSetData($iOut, '')
				GUICtrlSetData($iStatusBar, 'Не найдено')
			EndIf
		Case -3
			Exit
	EndSwitch
WEnd

список для теста
Иванов Иван Иванович 99-99-99 начальник отдела кадров
Петров Пётр Петрович 88-88-88 сотрудник отдела кадров
Гашников Андрей Владимирович 88-88-88 Инженер
Иванов Сергей Генадьевич 55-88-88 Инженер
Петров Константин Григорьевич 88-66-88 Инженер
Проверкин Провер Проверович 88-77-88 Стропальщик
Иванов Сергей Генадьевич 88-22-88 Стропальщик
Фамилия Имя Отчество 88-88-99 Стропальщик
Чебурашкин Андрей Владимирович 88-11-88 Стропальщик
Калмыков Александр Владимирович 88-22-88 Электромеханик
Комстромской Андрей Владимирович 88-33-88 Электромеханик
Фадеев Михаил Юрьевич 88-44-88 Электромеханик
Например вводим Андрей и находим уже 2 записи, или вводим Стропальщик и нааходим всех стропальщиков
 
Автор
C

chaos-13

Новичок
AZJIO сказал(а):
chaos-13
На ещё для твоего списка
Код:
#include <Array.au3>

; _________________________________
$sText = FileRead(@ScriptDir & '\phones.txt')
; $aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h([А-яЁё]+?)\r?$', 3)
$aRes=StringRegExp($sText, '(?m)^([А-яЁё]+?\h+[А-яЁё]+?\h+[А-яЁё]+?)\h+(\d\d-\d\d-\d\d)\h+([А-яЁё\h]+?)\r?$', 3)
If @error Then ; Проверка ошибки ОБЯЗАТЕЛЬНА. Данная проверка для StringRegExp
	MsgBox(0, 'Пусто', 'Проблема с файлом')
Else
	$u = UBound($aRes)
	$u2 = $u / 3
	Local $aRes2D[$u2][3]
	$d = 0
	For $i = 0 To $u - 1 Step 3
		$aRes2D[$d][0] = $aRes[$i]
		$aRes2D[$d][1] = $aRes[$i + 1]
		$aRes2D[$d][2] = $aRes[$i + 2]
		$d += 1
	Next
EndIf
$sOut = ''
; _ArrayDisplay($aRes2D) ; функция для просмотра массива
; _________________________________

$hGui = GUICreate('Кто звонил???', 500, 250)

GUICtrlCreateLabel("Ном.тел.:",5, 24, 130, 17)
GUICtrlCreateLabel("Ф.И.О:", 140, 24, 210, 17)
GUICtrlCreateLabel("Отдел / Должность",360, 24, 130, 17)
$iTel = GUICtrlCreateInput('', 5, 44, 130, 22)
$iFIO = GUICtrlCreateInput('', 140, 44, 210, 22)
$iData = GUICtrlCreateInput('', 360, 44, 130, 22)

GUICtrlCreateLabel("Результат", 5, 74, 490, 107)
$iOut = GUICtrlCreateEdit('', 5, 94, 490, 90)

$iBtn = GUICtrlCreateButton('Поиск', 390, 200, 90, 28)

$iStatusBar = GUICtrlCreateLabel('В базе ' & $u2 & ' телефонов', 5, 250 - 20, 495, 17)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $iBtn
			$sTel = GUICtrlRead($iTel)
			$sFIO = GUICtrlRead($iFIO)
			$sData = GUICtrlRead($iData)
			GUICtrlSetData($iStatusBar, 'Этап 1')
			Switch True
				Case $sTel
					$col = 1
					$sSearch = $sTel
				Case $sFIO
					$col = 0
					$sSearch = $sFIO
				Case $sData
					$col = 2
					$sSearch = $sData
				Case Else
					MsgBox(0, 'Пусто', 'Пусто')
					ContinueLoop
			EndSwitch
			$iCount = 0
			For $i = 1 To $u2 - 1
				If StringInStr($aRes2D[$i][$col], $sSearch) Then
					$sOut &= $aRes2D[$i][0] & ' ' & $aRes2D[$i][1] & ' ' & $aRes2D[$i][2] & @CRLF
					$iCount += 1
				EndIf
			Next
			If $sOut Then
				GUICtrlSetData($iOut, $sOut)
				GUICtrlSetData($iStatusBar, 'Найдено ' & $iCount)
				$sOut = ''
			Else
				GUICtrlSetData($iOut, '')
				GUICtrlSetData($iStatusBar, 'Не найдено')
			EndIf
		Case -3
			Exit
	EndSwitch
WEnd

список для теста
Иванов Иван Иванович 99-99-99 начальник отдела кадров
Петров Пётр Петрович 88-88-88 сотрудник отдела кадров
Гашников Андрей Владимирович 88-88-88 Инженер
Иванов Сергей Генадьевич 55-88-88 Инженер
Петров Константин Григорьевич 88-66-88 Инженер
Проверкин Провер Проверович 88-77-88 Стропальщик
Иванов Сергей Генадьевич 88-22-88 Стропальщик
Фамилия Имя Отчество 88-88-99 Стропальщик
Чебурашкин Андрей Владимирович 88-11-88 Стропальщик
Калмыков Александр Владимирович 88-22-88 Электромеханик
Комстромской Андрей Владимирович 88-33-88 Электромеханик
Фадеев Михаил Юрьевич 88-44-88 Электромеханик
Например вводим Андрей и находим уже 2 записи, или вводим Стропальщик и нааходим всех стропальщиков
Это уже круто)), мне надо только поиск по телефону и ФИО, а третья колонка с должностями для информации.
 

madmasles

Модератор
Глобальный модератор
chaos-13,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


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

chaos-13

Новичок
Сейчас пока разбираюсь в коде, который сюда любезно выложил AZJIO. Спасибо ему за это. Выглядит так, как я и хотел, правда для себя я чуток подправлю визуально). А теперь вопрос по коду:
Код:
$sText = FileRead(@ScriptDir & '\phones.txt')
; $aRes=StringRegExp($sText, '(?m)^((?:8|\+7)\d{10})\h([А-яЁё]+?\h[А-яЁё]+?\h[А-яЁё]+?)\h([А-яЁё]+?)\r?$', 3)
$aRes=StringRegExp($sText, '(?m)^([А-яЁё]+?\h+[А-яЁё]+?\h+[А-яЁё]+?)\h+(\d\d-\d\d-\d\d)\h+([А-яЁё\h]+?)\r?$', 3)

Для чего это регулярное выражение указано в самом начале программы??Ведь мы пока ещё не ищем ничего, а только необходимо сформировать массив значений. Вот это не совсем понял.
И ещё такой момент, если я хочу, чтобы поиск осуществлялся не только по нажатию на саму кнопку "поиск", а ещё и по клавише ENTER, какое событие надо отработать?
 

edyapd

Осваивающий
chaos-13 сказал(а):
Сейчас пока разбираюсь в коде, который сюда любезно выложил AZJIO.
...
Для чего это регулярное выражение указано в самом начале программы??Ведь мы пока ещё не ищем ничего, а только необходимо сформировать массив значений. Вот это не совсем понял.
Я хоть и не AZJIO, но попытаюсь объяснить. Этой строчкой заполняется массив из тех данных которые были прочитаны из файла. Дальше по коду из этого массива, уже делается двухмерный массив. По которому в дальнейшем и ведётся поиск.
Но сразу хочу вас предупредить, что код предполагает очень жёсткий формат введёных данных. Попробуйте подумать, почему вот эти данные не попадут в поиск
Иванов Петр Фёдорович 11-11-11 1-й Отдел
Серёга 22-33-44 Гараж
Леночка 45-56-67
Сан Саныч 23-32-23 Механик
Котов Кот Котофеевич 234-890 Зав. складом
И это только то, что придумалось навскидку.
P.S. Кстати первая строчка "Иванов Иван Иванович 99-99-99 начальник отдела кадров", тоже почему-то не ищется, но пока не вникал из-за чего.
 

ra4o

AutoIT Гуру
По поводу нажатия кнопки по Enter:
Код:
HotKeySet('{Enter}','button')
Func button()
	ControlClick('My Program','',$iBtn)
	EndFunc

а насчет чтения из xls файла в массив проще использовать _Excel_RangeRead и после работать с массивом.
 
Верх