Что нового

Поиск и сравнение данных в файлах *.txt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Добрый день.
Господа, помогите с реализацией. :'(
Пред история:
Компьютеры в сети при загрузке отправляют на сервер отчет в текстовом согласно строке
Код:
FileWrite($oFile, @TAB & @ComputerName & @TAB & @IPAddress1 & @TAB & @TAB & $Kasper & @TAB & $Vip & @TAB & $Kript & @TAB & $SUDIS & @TAB & @TAB & @TAB & @TAB & @TAB & @UserName & @CRLF)


где $Kasper, $Vip, $Kript, $SUDIS данные об установленных программах которые возвращают "ДА" или "НЕТ"
в текстовом файле выглядит так:
144-OIT-001 10.225.255.82 ДА ДА ДА ДА Иванов ИИ
057-SO-003 10.225.250.156 ДА НЕТ ДА НЕТ Сидоров СС

Данные отправляются только 1 раз в день, вне зависимости от кол-ва перезагрузок компьютера, и складываются в папку с отчетами по дате:

Код:
$oFile = FileOpen ( 's:\Server\REPORT\' & $FolderDestReport & @MDAY & ' ' & @MON & ' ' & @YEAR & '\REPORT.txt' , 9)

Есть файл User.txt с данными пользователей, вида:
ПРАВОВАЯ ГРУППА 10.225.255.26 г.Мухосранск Ленина 21 каб. 12 ДА НЕТ ДА ДА НЕТ Старший юрисконсульт майор Иванов И.И. 333-333 +7-999-999-9999
Задача:
1) Считать данные из всех файлов отчета, взяв к примеру один IP адрес, найти самый новый файл отчета содержащий этот IP, к примеру 01 01 2016 программа не была установлена а 10 01 2016 уже стоит, но в этом промежутке комп вообще не включался и соответственно отчет не слал, поэтому надо искать самый новый файл с этим IP, и считать состояние установки программ к примеру это будет - "ДА НЕТ ДА НЕТ", (причем выбрать нужно все уникальные IP во всех файлах).
2) Найти этот IP в User.txt, считать данные полей - подразделение (ПРАВОВАЯ ГРУППА), место установки (г.Мухосранск Ленина 21 каб. 12), должность (Старший юрисконсульт), звание (майор), Ф.И.О. (Иванов И.И.), телефон (333-333), телефон (+7-999-999-9999)
3) Записать в новый файл по маске, с разделителем полей (у меня во всех txt разделитель @TAB, но можно любой другой)
пустое поле/служба/IP/место установки/каспер/випнет/крипто/судис/пустое поле/пустое поле/должность/звание/фио/пустое поле/телеф/телеф сот.

Вся затыка в первом пункте (с остальными я думаю проблем не возникнет), а вот как выбрать все IP и затем проверить в каком из файлов самые свежие данные, сообразить не могу :'(
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
как выбрать все IP и затем проверить в каком из файлов самые свежие данные
Перебираете все папки , начиная с самой свежей, дальше в файле "REPORT.txt" выбираете IP , для проверки того, что выбранный IP оригинальный можно ввести переменную- строку, либо массив и писать туда обработанные IP, при проверке последующего IP искать его в этой строке.массиве и если не найден, значит оригинальный , дописать его в массив/строку и обработать данные... как-то так я это себе представляю
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
ra4o сказал(а):
как выбрать все IP и затем проверить в каком из файлов самые свежие данные
Перебираете все папки , начиная с самой свежей, дальше в файле "REPORT.txt" выбираете IP , для проверки того, что выбранный IP оригинальный можно ввести переменную- строку, либо массив и писать туда обработанные IP, при проверке последующего IP искать его в этой строке.массиве и если не найден, значит оригинальный , дописать его в массив/строку и обработать данные... как-то так я это себе представляю

А если в самой свежей нет какого то ip а в предыдущих он есть?
Я так думаю, что сначала нужно получить список всех ip, во всех файлах, выкинуть дублирование, а потом поочередно начинать искать в отчетах.
Но КАК это сделать? :stars:
 
A

Alofa

Гость
OffTopic:

Предлогаю вместо:
Код:
$oFile = FileOpen ( 's:\Server\REPORT\' & $FolderDestReport & @MDAY & ' ' & @MON & ' ' & @YEAR & '\REPORT.txt' , 9)

... делать примерно так:
Код:
$oFile = FileOpen ( 's:\Server\REPORT\' & $FolderDestReport & '_' & @YEAR & '.report' , 9)

Сам же .report файл будет иметь структуру INI:
Код:
# Секция => ГОД+МЕСЯЦ+ДЕНЬ
[20160902]
10.225.255.82 = 144-OIT-001|ДА|ДА|ДА|ДА|ИвановИИ
10.225.250.156 = 057-SO-003|ДА|НЕТ|ДА|НЕТ|СидоровСС
... и соответственно запись и считывание данных будет производиться через INI функции.
Так наверно будет по проще вазюкаться.
 

pvnn

Осваивающий
Сообщения
305
Репутация
32
Создавайте дополнительный ini-файл на сервере, в который записывайте все IP адреса и последние (новые пути к отчету):
Код:
$TxtFileName='s:\Server\REPORT\' & $FolderDestReport & @YEAR &@MON &@MDAY & '\REPORT.txt'
$IniFile='s:\Server\REPORT\IpList.ini'
IniWrite($IniFile,@IPAddress1,'Path',$TxtFileName)


В результате получите:
[10.225.255.82]
Path=s:\Server\REPORT\$FolderDestReport\20160902\REPORT.txt

Каждый раз новый путь к файлу отчета будет обновляться
Считать все значения IP адресов из ini можно функцией IniReadSectionNames.
Далее, необходимо просто пробежаться по массиву ip-адресов, считать путь Path (IniRead), далее открываете нужный отчет и считываете что вам нужно
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
А если в самой свежей нет какого то ip а в предыдущих он есть?
Вы начинаете читать с самой свежей папки, первый
IP сравниваете с массивом/строкой/ini файлом (не важно, как Вам понравится) его(IP) там нет, так как массив изначально пустой, добавляете этот IP в массив/строку/ini файл и обрабатываете данные и так далее со следующим IP, если вдруг, в какой-то из давних папках попадётся IP, которого не было ранее, то его не будет и в массиве/строке.... работаете с ним и так Вам нужно будет перебрать все папки с отчётами. При последующем запуске массив/строку/ini файл затираете и всё по-новой.
Как по мне - со строкой даже проще:
Код:
;Вначале строка пустая
Local $Stroka=''

;далее перебираете папки , начиная с самой свежей и выделяете IP в переменную $IP
If Not StringInStr($Stroka,$IP) Then
	$Stroka&=$IP&@TAB
	;дальше делаете всё, что нужно с данными по этому IP
EndIf
; дальше, если с этим IP Вы уже работали, то он будет содержаться в строке и обрабатываться не будет
Да, как писали выше работать через ini файл гораздо удобнее, но его нужно создавать и изменять в момент записи отчёта локальным ПК на сервере - происходит запись отчёта и сразу запись в ini файл
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Переписал файл сбора отчета сделав:
Код:
;~ Открытие файла отчета
	  $IniFile = 'd:\Server\REPORT\' & $FolderDestReport & 'REPORT.ini'

	  ;~ запись в файл
	  $SectionIni = @IPAddress1
	  $value = $Kasper & @TAB & $Vip & @TAB & $Kript & @TAB & $SUDIS
	  IniWrite($IniFile, $SectionIni, 'key', $value)

соберу инфу, потом дальше ковырять буду, спасибо за идею с ini файлом.

Если можно разъясните, при каждой отправке в отчет, такой код будет перезаписывать секцию, или тоже может получиться дублирование секций?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Лучше всё писать в одну секцию , где ключ - это IP, а значение - путь к файлу , таким образом в ini файле по каждому IP будет путь к самому свежему файлу отчёта. А вообще в идеале было-бы - Имя секции - IP адрес, внутри секции ключи Kasper , Vip , Kript итд со своими значениями, в этом случае выбрать нужную информацию можно моментально одним запросом
Код:
;~ запись в файл
$SectionIni = @IPAddress1

IniWrite($IniFile, $SectionIni, 'Kasper', $Kasper)
IniWrite($IniFile, $SectionIni, 'Vip', $Vip)
IniWrite($IniFile, $SectionIni, 'Kript', $Kript)
IniWrite($IniFile, $SectionIni, 'SUDIS', $SUDIS)
 
A

Alofa

Гость
ra4o сказал(а):
... таким образом в ini файле по каждому IP будет путь к самому свежему файлу отчёта.
... а точнее он будет всего один для данного IP. Если автору не нужна подневная история - тогда именно так и нужно делать.
(Это я про свой вариант, когда все отчеты за год собираются а 1 файл)
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
ra4o сказал(а):
Лучше всё писать в одну секцию , где ключ - это IP, а значение - путь к файлу , таким образом в ini файле по каждому IP будет путь к самому свежему файлу отчёта. А вообще в идеале было-бы - Имя секции - IP адрес, внутри секции ключи Kasper , Vip , Kript итд со своими значениями, в этом случае выбрать нужную информацию можно моментально одним запросом
Код:
;~ запись в файл
$SectionIni = @IPAddress1

IniWrite($IniFile, $SectionIni, 'Kasper', $Kasper)
IniWrite($IniFile, $SectionIni, 'Vip', $Vip)
IniWrite($IniFile, $SectionIni, 'Kript', $Kript)
IniWrite($IniFile, $SectionIni, 'SUDIS', $SUDIS)

Почти так и сделал, в итоге получается ini с содержимым:
[10.229.202.248]
key=ДА ДА ДА ДА
или лучше сделать отдельные ключи под каждую переменную?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
С отдельными ключами Вам в дальнейшем проще будет, уже каждому ключу есть значение
 
Верх