recherche de texte dans un fichier a partir d'une liste

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

recherche de texte dans un fichier a partir d'une liste

#1

Message par atlas12345 »

Salut a tous,

je cherche a dev un bout de code qui me permettrais d'extraire des données d'un fichier texte a partir d'une liste et faire ressortir tout ca dans un tableau.

je m'explique,

j'ai, dans un fichier excel (IP.xls), les champs suivants :
- une adresse ip
- un numéro de carte SIM

| N°SIM | IP |
|12345678910| 172.30.0.1|
|22345678910| 172.30.0.2|

Un appareil utilisant une des cartes sim du fichier IP.XLS se connecte sur un serveur ftp pour déposer des fichiers,lorsqu'il se connecte, l'adresse IP de la SIM utilisée est loggée dans le fichier log.txt du serveur ftp.

ci dessous le détail du fichier log.txt (log du serveur FTP)

(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> Connected on port 21, sending welcome message...
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> 220-FileZilla Server 0.9.60 beta
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> 220-written by Tim Kosse (tim.kosse@filezilla-project.org)
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> 220 Please visit https://filezilla-project.org/
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> AUTH TLS
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> 502 Explicit TLS authentication not allowed
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> AUTH SSL
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> 502 Explicit TLS authentication not allowed
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> USER toto
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> 331 Password required for toto
(000002) 09/12/2017 15:04:54 - (not logged in) (192.168.1.68)> PASS ****
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 230 Logged on
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> SYST
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 215 UNIX emulated by FileZilla
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> FEAT
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 211-Features:
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> MDTM
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> REST STREAM
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> SIZE
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> MLST type*;size*;modify*;
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> MLSD
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> UTF8
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> CLNT
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> MFMT
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> EPSV
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> EPRT
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 211 End
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> PWD
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 257 "/" is current directory.
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> TYPE I
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 200 Type set to I
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> PASV
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 227 Entering Passive Mode (192,168,1,68,216,1)
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> MLSD
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 150 Opening data channel for directory listing of "/"
(000002) 09/12/2017 15:04:54 - toto (192.168.1.68)> 226 Successfully transferred "/"

je cherche a lister dans un tableau la date et l'heure de la dernière connexion de chacune des IP du fichier IP.XLS.

pouvez vous m'indiquer comment faire ?
Fichiers joints
log.txt
(2.68 Kio) Téléchargé 115 fois
IP.xls
(26 Kio) Téléchargé 103 fois
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: recherche de texte dans un fichier a partir d'une liste

#2

Message par mikell »

Ce bout de code extrait la date et l'heure de la ligne du texte qui mentionne à la fois l'IP voulue et "Logged on"
Le reste c'est de la mécanique, boucle For/Next, etc
$ip = "192.168.1.68"

$txt = FileRead("log.txt")
$a_logged = StringRegExp($txt, '(\d{2}/\d{2}/\d{4}\h\d{2}:\d{2}:\d{2}).+' & $ip & '.+Logged on', 3)
If IsArray($a_logged) Then Msgbox(0,"", $a_logged[0])
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

Re: recherche de texte dans un fichier a partir d'une liste

#3

Message par atlas12345 »

Salut Mikell,

En exécutant ton bout de code, je retrouve bien la date et heure de connexion pour l'adresse ip déclarée par $ip = "192.168.1.68". c'est un bon début et celà réponds a ce que je cherche a faire.

par contre dans ton exemple ci dessous il faudrait renseigner une a une les adresses IP (300!?) pour savoir si elles ont communiquées avec le serveur FTP.
Comment je peux faire pour déclarer une variable qui irait directement chercher la liste des ip dans le fichier excel (ip.xls)?
et aussi, faire sortir le résultat sous forme de tableau ?

pour le moment je cherche sur le forum des exemples qui me permettrait de fabriquer ce script.

toute aide est la bienvenue :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: recherche de texte dans un fichier a partir d'une liste

#4

Message par mikell »

Je suis parfaitement nul en Excel :mrgreen:
Mais heureusement je dispose du fichier d'aide AutoIt, qui me dit que par exemple _Excel_RangeRead pourrait te sortir la liste des IP dans un tableau
#include <Array.au3>
#include <Excel.au3>

Local $oAppl = _Excel_Open(false)
Local $oWorkbook = _Excel_BookOpen($oAppl, @ScriptDir & "\IP.xls")
Local $aResult = _Excel_RangeRead($oWorkbook, Default, "B2:B3", 2)
_Excel_Close($oAppl)
_ArrayDisplay($aResult)
et ensuite une boucle For/Next dans ce tableau en utilisant le code de mon post précédent devrait faire l'affaire
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

Re: recherche de texte dans un fichier a partir d'une liste

#5

Message par atlas12345 »

En fait je n'ai pas besoin de sortir la liste des IP dans un tableau puisque je la connait. :D

je voudrais juste a partir de cette liste d'IP faire une recherche dans le fichier de log et sortir le tout dans un tableau.

Liste IP > recherche des IP dans les logs > tableau avec date de derniere connexion pour chaque IP

de mon coté j'ai quand même avancé, voilà ce que j'ai fait:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=

Global $Form1 = GUICreate("Dernière Connexion au FTP", 414, 152, 192, 124)
Global $ListOsType = GUICtrlCreateCombo("Choisir l'ip", 104, 40, 145, 25)
Global $Go = GUICtrlCreateButton("rechercher", 152, 96, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Dim $OsType[321] = ["192.168.1.68",  "172.30.0.1", "172.30.0.2"]

; On construit le string
Global $string = ""

For $i In $OsType
    $string &= $i & "|"
Next
$string = StringTrimRight($string, 1)

GUICtrlSetData($ListOsType, $string)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $Go
            Go_List()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func Go_List()
    local $Os = GuiCtrlRead($ListOsType)
      $ip = $Os
         $txt = FileRead("log.txt")
            $a_logged = StringRegExp($txt, '(\d{2}/\d{2}/\d{4}\h\d{2}:\d{2}:\d{2}).+' & $ip & '.+Logged on', 3)

            If IsArray($a_logged) Then
      Msgbox(0,$ip, $a_logged[0])
   Else
      MsgBox( $txt, "Recherche dans les logs", "IP NON TROUVÉE.")
EndIf
EndFunc   ;==>Go_List
mais bon ce script n'a pas vraiment de sens car il est possible de faire la même chose avec notepad++ par exemple ... de plus ,il faut se pogner les IP une a une.

je ne vois pas comment prendre les IP de mon fichier excel, parcourir le contenu du fichier de log et si on trouve l'IP (on a aussi la date et heure de la dernière connexion) on renseigne tout çà dans un tableau.
lpau63
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 23 mars 2017 15:44
Status : Hors ligne

Re: recherche de texte dans un fichier a partir d'une liste

#6

Message par lpau63 »

bonjour,
ci dessous une solution "incomplète"
attention aux fonction excel utilisée, j'ai fait quelques modif dans mon excel.au3, il se peut qu'il y ait des différences avec celui de base

Code : Tout sélectionner

#include <Array.au3>
#include <Excel.au3>

Global $a_logged_Heures,$a_logged_IP

_Chargement_Log()
_Chargement_Profils_XLS()

	For $i = 1 To ubound($a_logged_Heures)-1
		For $j = 0 To ubound($varNPC)-1
			   If $varNPC[$j][1] = $a_logged_Heures[$i][1] Then
				ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :IP = ' & $varNPC[$j][1] & @tab & 'Heures Connexion : ' & $a_logged_Heures[$i][0] & @crlf) ;### Debug Console

				;rajouter du code pour écrire dans un fichier excel



				EndIf
		Next
	Next

Func _Chargement_Log()

$txt = FileRead("C:\Downloads\log.txt")
$a_logged_Heures = StringRegExp($txt, '(\d{2}\/\d{2}\/\d{4}\h\d{2}:\d{2}:\d{2}).+Logged on', 3)	; recup des heures
$a_logged_IP = StringRegExp($txt, '(\b(?:\d{1,3}\.){3}\d{1,3}\b).+Logged on', 3)				; récup des IPs

_ArrayColInsert($a_logged_Heures, 1)	; rajout d'une colonne dans la table pour Heures/Ip

	For $i = 0 To ubound($a_logged_IP)-1
		$a_logged_Heures[$i][1] = $a_logged_IP[$i]
	Next

EndFunc

Func _Chargement_Profils_XLS()
	If FileExists("C:\Downloads\IP.xls") Then
		$sFilePath1 = "C:\Downloads\IP.xls"
	Else
		$sFilePath1 = FileOpenDialog("Ouvrir le fichier des IP", "C:\Downloads\", "Fichier Excel (*.xls?)", 1)
	EndIf

	If @error Then
		MsgBox(4096, "", "aucun fichier sélectionné")
		Exit
	EndIf
;~ ===========

Local $timer_global=TimerInit()
	Global $oAppl = _Excel_Open()
	Global $oExcel = _Excel_BookOpen($oAppl, $sFilePath1, True, True)
	Global $varNPC = _Excel_RangeRead($oExcel, "ip")
ConsoleWrite( "-> Chargé en : " & StringFormat( "%.2f seconds." ,TimerDiff($timer_global)/1000 )&@LF )

	_Excel_BookClose($oExcel)
	_Excel_Close($oAppl)

;~ 	==============


EndFunc

atlas12345
Niveau 1
Niveau 1
Messages : 10
Enregistré le : ven. 03 févr. 2017 09:47
Status : Hors ligne

Re: recherche de texte dans un fichier a partir d'une liste

#7

Message par atlas12345 »

Salut lpau63,

incomplète :bisou: je confirmes, mais te remercie d'avoir bien voulu te pencher sur le sujet. il me semble avoir complété la partie manquante en me basant sur le bout de code de Mikell et l'aide (;rajouter du code pour écrire dans un fichier excel) Par contre n'ayant pas votre doigté (surtout votre XP) j'y suis allé comme un bourrin sur le code mais, ma foi je retrouve bien en sortie les données dans un fichier Excel.

Nous pouvons considérer le sujet comme clos.

néanmoins, je me dis que vu le temps que j'ai (vous aussi hein) passé a comprendre ce que je faisais je trouve dommage qu'a la fin du script le fichier ne soit pas enregistré directement dans un répertoire et tant qu'a faire que les données soit dédoublonnées.

c'est pas compliqué de dédoublonner le contenu de cellules avec Excel et de faire un enregistrer sous:
=> mais quand même ! :D

En tout cas cela me sera bien pratique ce script !
#include <Array.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>

Global $a_logged_Heures,$a_logged_IP

_Chargement_Log()
_Chargement_Profils_XLS()

   For $i = 1 To ubound($a_logged_Heures)-1
      For $j = 0 To ubound($varNPC)-1
            If $varNPC[$j][1] = $a_logged_Heures[$i][1] Then
            ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :IP = ' & $varNPC[$j][1] & @tab & 'Heures Connexion : ' & $a_logged_Heures[$i][0] & @crlf) ;### Debug Console

            ;rajouter du code pour écrire dans un fichier excel




            EndIf
      Next
   Next

Func _Chargement_Log()

$txt = FileRead("C:\Downloads\log.txt")
$a_logged_Heures = StringRegExp($txt, '(\d{2}\/\d{2}\/\d{4}\h\d{2}:\d{2}:\d{2}).+Logged on', 3) ; recup des heures
$a_logged_IP = StringRegExp($txt, '(\b(?:\d{1,3}\.){3}\d{1,3}\b).+Logged on', 3)          ; récup des IPs

_ArrayColInsert($a_logged_Heures, 1)   ; rajout d'une colonne dans la table pour Heures/Ip

   For $i = 0 To ubound($a_logged_IP)-1
      $a_logged_Heures[$i][1] = $a_logged_IP[$i]
   Next

EndFunc

Func _Chargement_Profils_XLS()
   If FileExists("C:\Downloads\IP.xls") Then
      $sFilePath1 = "C:\Downloads\IP.xls"
   Else
      $sFilePath1 = FileOpenDialog("Ouvrir le fichier des IP", "C:\Downloads\", "Fichier Excel (*.xls?)", 1)
   EndIf

   If @error Then
      MsgBox(4096, "", "aucun fichier sélectionné")
      Exit
   EndIf
;~ ===========

Local $timer_global=TimerInit()
   Global $oAppl = _Excel_Open()
   Global $oExcel = _Excel_BookOpen($oAppl, $sFilePath1, True, True)
   Global $varNPC = _Excel_RangeRead($oExcel, "ip")
ConsoleWrite( "-> Chargé en : " & StringFormat( "%.2f seconds." ,TimerDiff($timer_global)/1000 )&@LF )

   _Excel_BookClose($oExcel)
   _Excel_Close($oAppl)

;~    ==============


EndFunc

Local $oAppl = _Excel_Open()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeWrite Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookNew($oAppl)
If @error Then
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeWrite Example", "Error creating the new workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _Excel_Close($oAppl)
    Exit
EndIf


; ************************************************** ***************************
; Ecrit une chaîne avec un saut de ligne dans la feuille active du classeur actif
; ************************************************** ***************************
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $a_logged_Heures & $a_logged_IP)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "OOPS !", "Fuck :)." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
MsgBox($MB_SYSTEMMODAL, "Generation du fichier", "Export termine.")
 
Répondre