[R] Recuperer des info d'un fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[R] Recuperer des info d'un fichier

#1

Message par Iste »

Salutations,

Bon, le titre est pas top top, mais vous devriez comprendre avec ce qui suit.

J'ai un script php qui ecrit ses log les un au dessus des autre dans une page html
Les log se présentent tous de la meme maniere
##### Message du 2009/04/07 15:08:36 #####
De : NOM - IPenvoyée (Adresse@email.deluser)
Pour : Adresse@email.delautre
Sujet : Sujet
Corps :

IP de celui qui appel le script php


Message

#####
(note : les couleurs sont aléatoires)

Ce qui donne en html

Code : Tout sélectionner

<b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br>
J'aimerais donc pouvoir recuperer ces log (bon ca facile) et les trier
Mais comme tout est ecrit en une seule ligne, je sais pas trop comment faire :/

Donc, j'aimerais un bout de script ou une fonction, qui se chargerait de trouver tout les message, et de recup le info
(par exemple en créant un array 2D)

Apres, je pense pouvoir me demerder pour le reste, pis sinon je reviendrais demander de l'aide :)

Voila, merci beaucoup ^^
Modifié en dernier par Iste le dim. 19 avr. 2009 21:12, modifié 1 fois.
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11823
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#2

Message par Tlem »

Eventuellement, avec StringSplit et en utilisant comme séparateur, le mot Message.
Sinon, il faudrait plus d'éléments (une suite de messages) et les éléments exact de ce que vous voulez récupérer et comment vous les voulez.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#3

Message par Iste »

En effet, séparer les messages est possible avec Stringsplit("","##### Message",1) sauf si le corps d'un des message contien cette chaine de caractere...
(normalement ca devrait pas arriver ^^' et on peut sécuriser en rajoutant le <b>, mais bon...)

Sinon, le log ben, pour avoir une petit idee de a quoi il ressemble suffit de copier coller les exemple (je peux pas mettre plus car il contient des info privé :/
► Afficher le texteTexte
► Afficher le texteHTML
Sinon, j'aimerais bien recup les infos suivante de la facon suivante :

$var [n][0] = date (2009/04/07)
$var [n][1] = heure (15:08:36)
$var [n][2] = NOM
$var [n][3] = IPenvoyée
$var [n][4] = Adresse@email.deluserdate (2009/04/07)
$var [n][5] = Adresse@email.delautre
$var [n][6] = Sujet
$var [n][7] = IP de celui qui appel le script php
$var [n][8] = Message

En tout cas, merci pour l'idée du stringsplit(), je sais pas pourquoi je n'y avait pas pensé ! Avec je dois pouvoir récuperer une grande parti des info (en découpant avec StringLeft/Right() ca devrait passer)
Toute foi c'est pas tres propre, et les log etant long, j'ai un peu peur du temps d'execution :/

voila, encore merci !
Signez ici
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#4

Message par GaRydelaMer »

Bonsoir

tu as aussi les Regexp qui sont vraiment trés utiles pour ce genre d'analyse.

[HS:On]
Étonnant que Tlem ne l'est pas préciser dans son message ;-)
Voir la suppression dans un tableau
[/HS]
Toiinou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 07 avr. 2009 19:45
Localisation : Caen
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#5

Message par Toiinou »

Évidemment qu'il faut utiliser des RegExp(Je vois pas d'autres solutions :shock: )

Je pense qu'il faudrait capturer chaque "bloc" en prenant tout ce qu'il y a entre "<b>##### Message du " & "</br><b>#####</b></br></br><b>##### Message du "(Un peu a la barbare mais avec des RegExp comme ça c'est souvient bien "sécuriser") puis ensuite faire une boucle avec différentes RegExp pour chaque éléments. Je vais essayer de voir ce que je peut faire déjà qu'avec PHP et les RegExp je me prend la tête...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11823
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#6

Message par Tlem »

J'avais bien pensé aux Regexp, mais c'est franchement pas du tout ma spécialité.
Perso, je trouve que ça permet de faire plein de chose en peut de code, mais c'est pas forcément plus rapide (en terme de rapidité d'exécution et surtout en réalisation du pattern). :wink:

Donc là en l'occurrence, je privilégierais plus le code que la Regexp.
Voici ce que je ferais :
1 - Récupération du texte brut (pas le html)

2 - StringSplit sur ##### .Cela nous donnera un tableau avec élément = date du Log et élément +1 = le Log.

3 - Décomposition de la chaîne date et heure (toujours StringSplit mais sur l'espace).

4 - Décomposition de la chaîne du Log (un ptit peut plus complexe).
Je ferais une lecture de chaîne à la recherche de mon élément de recherche (De : <= par exemple) puis je lirais ma chaîne jusqu'au @CR
Idem avec 'Pour :', 'Sujet :', Corps : ...
Ou plus simplement, on peut utiliser un _StringBetween ce qui donnerait pour le champ De :

Code : Tout sélectionner

$De = _StringBetween($Chaine, 'De : ', 'Pour : ')
Bon voilà, j'ai exposé mon avis, mais il y à d'autres façons. ;)

Edit : Après avoir re-visionner le texte, je ferais un StringSplit sur le retour de ligne. Ca nous donnerais un tableau qui contiendrais chaque élément à récupérer. Donc il suffit de contrôler l'élément de début (la date), de la parser, puis de parser les lignes qui suivent puisqu'elles ont toujours le même format. 8)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#7

Message par timmalos »

Bon ben les modos sont la pour se completer,j'ai pour ma part passé la soirée a trouver un regex, j'ai pas réussi, mais l'avancement peur servir donc je pose le code:

Code : Tout sélectionner

Global $i = 0
$string = '<b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse.test@sfr.fr</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br>'

$reponse = StringRegExp ( $string, '##### Message du ([0-9]{4}(/[0-9]{2}){2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})',2)
MsgBox(0,@error,@extended)
$reponse2 = StringRegExp ( $string, ' #####</br>De : <font color="[A-F0-9]{6}">([A-Z]+) - (([0-9]{1,3}\.){3}[0-9]{1,3})</font> \(<font color="#[a-fA-F0-9]{6}">(([a-zA-Z0-9_-])+([.]?[a-zA-Z0-9_-]{1,})*@([a-zA-Z0-9-_]{2,}[.])+[a-zA-Z]{2,4})</font>\)',2)
MsgBox(0,@error,@extended)
for $i = 0 to UBound($reponse2) - 1
    msgbox(0, "RegExp Test with Option 3 - " & $i, $reponse2[$i])
Next

MsgBox(0,"date",$reponse[1])
MsgBox(0,"heure",$reponse[3])
 

Je pense qu'il manque pas grand chose, mais la 2eme ne marche pas, donc je n'ai pas pu l'inclure à la première ce que je voulais faire à la base.


Ceci ne gère que les informations à l'interieur d'un seul message, il faudra auparavant faire une boucle avec une regex ou StringSplit Pour séparer tous les messages.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#8

Message par GaRydelaMer »

Bonsoir

J'ai fais ca quand à moi :

Code : Tout sélectionner

$text = "##### Message du 2009/04/07 15:08:36 #####" & @CRLF & _
        "De : NOM - IPenvoyée (Adresse@email.deluser)" & @CRLF & _
        "Pour : Adresse@email.delautre" & @CRLF & _
        "Sujet : Sujet 1" & @CRLF & _
        "Corps :" & @CRLF & _
        "" & @CRLF & _
        "IP de celui qui appel le script php" & @CRLF & _
        "" & @CRLF & _
        "Message 1" & @CRLF & _
        "" & @CRLF & _
        "#####" & @CRLF & _
        "" & @CRLF & _
        "##### Message du 2009/04/06 15:08:36 #####" & @CRLF & _
        "De : NOM - IPenvoyée (Adresse@email.deluser)" & @CRLF & _
        "Pour : Adresse@email.delautre" & @CRLF & _
        "Sujet : Sujet 2" & @CRLF & _
        "Corps :" & @CRLF & _
        "" & @CRLF & _
        "IP de celui qui appel le script php" & @CRLF & _
        "" & @CRLF & _
        "Message 2" & @CRLF & _
        "" & @CRLF & _
        "#####"

$text = StringRegExpReplace($text, " #####|##### ", "")
$text = StringTrimRight($text, 5)
$text = StringRegExpReplace($text, "#####\s*", "|")
$logs = StringSplit($text, "|")

For $i = 1 To $logs[0]
    $date = StringRegExp($logs[$i], "du ([0-9 :/]*)", 3)
    ConsoleWrite("++ Date ++" & $date[0] & @LF)
    
    $de = StringRegExp($logs[$i], "De : (.*)", 3)
    ConsoleWrite("++ De ++" & $de[0] & @LF)
    
    $pour = StringRegExp($logs[$i], "Pour : (.*)", 3)
    ConsoleWrite("++ Pour ++" & $pour[0] & @LF)
    
    $sujet = StringRegExp($logs[$i], "Sujet : (.*)", 3)
    ConsoleWrite("++ Sujet ++" & $sujet[0] & @LF)
    
    $pos = StringInStr($logs[$i], "Corps :")
    $msg = StringTrimLeft($logs[$i], $pos + 6)  
    ConsoleWrite("++ Msg ++" & $msg & @LF)
Next
 
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#9

Message par Iste »

Wouu plein de réponses ^^ merci !

Je ne connaissais pas _StringBetween, cette fonction peut merveilleusement m'aider :)

Mais moi je bloque bien avant ^^'
Comment recuprer le texte tel qu'il s'affiche ? histoire d'eviter d'etre embeté par les couleurs alléatoires et pouvoire se caler sur les retour a la ligne.

Ensuite, apres avoir stringsplité entre ##### et apliqué le code de timmalos (merci a lui :)) me sufira de faire comme tlem a dit pour récup tout les info 1er du log.

Recup l'adresse entre parentheses et s'eparer l'IP du corps du message ne devrait pas etre trop compliqué apres ca

Encore merci a vous tous de vous interesser a mon probleme !

Edit : GaRydelaMer a posté pendant que je rédigai mon message, je regarde ton code tout de suite :) merci
Signez ici
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#10

Message par GaRydelaMer »

Edit

Au début du script pour enlever le HTML

Code : Tout sélectionner

$text = StringReplace($text, "</br>", @CRLF)
$text = StringRegExpReplace($text, "</?[^>]*>*", "")
 
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11823
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#11

Message par Tlem »

Ha ha ha ... Challenge quand tu nous tiens.

Voilà pour récupérer le corp du texte d'un fichier HTML et dans votre cas le mettre en tableau :

Code : Tout sélectionner

#include <IE.au3>
#Include <Array.au3>

$LeFichier = "Test.html"

$oIE = _IECreate ("about&#058;blank", 0, 0)
$html = FileRead($LeFichier)

_IEDocWriteHTML($oIE, $html)
$sText = _IEBodyReadText ($oIE)

$aHtml = StringSplit(StringReplace($sText, @CR, ""), @LF)
_ArrayDisplay($aHtml,"")
La méthode de Gary est excellente dans votre cas, mais si la page venait à avoir d'autres balises non prises en charge par le pattern, alors cela fausserait le résultat.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#12

Message par Iste »

ben je vais prendre la methode a gary alors :)
car je suis (presque) sûr qu'il n'y aura pas de balise mechantes, et sutout, car les fonction _IE sont beaucoup trop lentes et lourdes pour moi ^^'
Mais merci quand meme pour l'astuce, car si je viens a en avoir besoin, c'est deja dans la poche ;)

Bon beh, je crois que avec tout ca je vais bien pouvoir m'amuser :)

Je clos pas le poste, car j'ai pas encore testé xD pis au cas ou il vous viendrez l'envie d'en faire un peu plus :p
Mais c'est deja super ;)

Merci a vous tous !
Signez ici
Toiinou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 07 avr. 2009 19:45
Localisation : Caen
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#13

Message par Toiinou »

Moi j'ai fais sa :

Code : Tout sélectionner

#include <Array.au3>;Seulement pour afficher l'array finale avec _ArrayDisplay

Dim $file, $read, $NbRow, $nOffset = 1, $array, $Message = 0

;Ouvrir la page html pour la lire
$file = FileOpen('pagedelog.html', 0)
$read = FileRead($file)
FileClose($file)

;Compter le nombre de messages et préparer le tableau finale 2D
$NbRow = StringRegExp($read, '<b>##### Message du (.*?)</br><b>#####</b></br></br>', 4)
$NbRow = UBound($NbRow)
Dim $Arr[$NbRow][9]

While 1
    ;Regex de séparation des elements
    $array = StringRegExp($read, '<b>##### Message du ([0-9]{4}/[0-9]{2}/[0-9]{2})\s([0-9]{2}:[0-9]{2}:[0-9]{2})\s#####</br>De\s:\s<font color="#?[0-9A-F]{6}">([A-Za-z]+)\s-\s([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})</font>\s\(<font color="#?[0-9A-F]{6}">([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})</font>\)\s</br>Pour\s:\s<font\scolor="#?[0-9A-F]{6}">([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})</font></br>Sujet\s:\s<font\scolor="#?[0-9A-F]{6}">([A-Za-z]+)</font></br>Corps\s:\s</br></br><html><head><title>.*?</title></head><body><b>([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})</b></b></br></br>(.*?)</br><b>#####</b></br></br>', 1, $nOffset)
    If @error = 0 Then
        $nOffset = @extended
    Else
        ExitLoop
    EndIf
    ;Ajouter les elements dans le tableau finale
    For $i = 0 To UBound($array) - 1
        $Arr[$Message][$i] = $array[$i]
    Next
$Message = $Message+1
WEnd

_ArrayDisplay($arr);Juste pour afficher l'array finale
Avec une belle grande RegExp :mrgreen:
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#14

Message par Iste »

Merci Toiinou ! Ca m'a l'air d'etre ce que je cherchais :)
A ca pret que chez moi ca marche pas :/
Le super patern ne trouve rien :\
Jai testé avec ceci :
► Afficher le texte
Je suis trop nul pour comprendre d'ou vient le probleme ^^' mais je vias quand meme chercher :p

en tout cas, merci encore !
Signez ici
Toiinou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 07 avr. 2009 19:45
Localisation : Caen
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#15

Message par Toiinou »

Mon pattern teste les vrais faux log c'est a dire qu'il teste si " a la place d' "IPenvoyée" sa a bien la forme d'une ip, si "Adresse@email.delautre" a bien la forme d'une email, etc donc si tu teste avec ta page ou tes log sont enregistré par le script php sa devrait fonctionner ?
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#16

Message par Iste »

ho ben, j'ai pas regardé dans ce sens là.
Je vais m'y attarder plus attentivement les quelque jours de vac que j'ai devant moi, je vous tiendrais au courant a mon retour !
Signez ici
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#17

Message par timmalos »

Toiinou a fait exactement ce à quoi je voulais arriver, au mot pret ;), sauf que lui il a reussi, snif... :wink: Mon pattern ne marchait pas, mais peut etre a t'il utilisé mes essais pour continuer? :P
Toiinou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 07 avr. 2009 19:45
Localisation : Caen
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#18

Message par Toiinou »

Ouép, j'ai tricher j'ai pris en prenant ton début du pattern qui servait a récupérer la date et l'heure :oops: Ta essayer mon pattern ? il fonctionne ?
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#19

Message par Iste »

@Toiinou, me suis cassé la tete a essayer de comprendre ton patern, mais maintenant que j'ai compris, il marche impec ^^

Mais, il n'y a pas moyen, comme en php, de récuperer ce qui se trouve dans chaque parenthese, afin de l'isoler dans une variable ?
Pas trouvé de ca sur la doc :/
Signez ici
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Recuperer des info d'un fichier

#20

Message par timmalos »

Si y'a moyen, c'est ce que j'ai fait dans mon code, pour le premier pattern.
$reponse = StringRegExp ( $string, 'pattern',2)
Puis

MsgBox(0,"date",$reponse[1])
MsgBox(0,"heure",$reponse[3])
Répondre