Page 1 sur 1
Purge et tri d'un fichier log
Posté : sam. 11 juin 2016 17:20
par gothgothhh
Bonjour, quelque chose de paranormal m'est arriver ce matin, en faite, mon but est de supprimé des lignes d'un fichier sous condition d'avoir un string à l'interieur ou que la ligne soit vide, mais une fois le procédé terminé, le fichier out est plus lourd que le fichier in ...
Code : Tout sélectionner
#include <File.au3>
#include <Array.au3>
Global $temppurge = @ScriptDir & "\templog.log"
_Purge(@ScriptDir & "\log.log")
Func _Purge($filetopurge)
local $aLines
FileDelete($temppurge)
_FileReadToArray($filetopurge, $aLines)
For $i = $aLines[0] To 1 Step -1
;~ local $filter1 = StringInStr($aLines[$i],"")
;~ local $filter2 = StringInStr($aLines[$i],"")
If $aLines[$i] = "" Then
_ArrayDelete($aLines, $i)
EndIf
;~ If $filter1 or $filter2 <> 0 Then
;~ _ArrayDelete($aLines, $i)
;~ EndIf
Next
_FileWriteFromArray($temppurge, $aLines, 1)
EndFunc
Quelqu'un saurait pourquoi le out sort plus lourd que le le in alors que j'y retire toutes les lignes vides(que sa ne change rien sur la taille je veux bien, mais là la taille augmente carrément

????
Et je n'arrive pas à trouver de solutions pour pouvoir mettre plusieurs filtres en les appelant avec la fonction comme ceci _Purge("le fichier","filtre1-filtre2-filtre3")
quelqu'un aurait une idée ?
Merci d'avance et à très vite !
Re: Purge et tri d'un fichier log
Posté : sam. 11 juin 2016 17:57
par orax
Je n'ai pas ce comportement paranormal. Les lignes vides sont supprimées. Si ça ne marche pas, c'est peut-être la faute aux petits hommes verts...

Re: Purge et tri d'un fichier log
Posté : sam. 11 juin 2016 18:12
par gothgothhh
C'est étonnant dès qu'il se met à filtré des fichiers de 500ko et plus, il y a de grosses différences alors que pourtant, le fichier contient effectivement plus aucunes lignes vides ...
tu n'aurais pas une solution pour mon problème de filtre multiples par hasard ? ^^
Re: Purge et tri d'un fichier log
Posté : sam. 11 juin 2016 19:41
par mikell
Tu pourrais utiliser une expression régulière, quelque chose comme ça (c'est pour le concept, il manque la gestion d'erreurs)
Code : Tout sélectionner
$str = "1aaa 1" &@crlf& "2 bbb$ 2" &@crlf&@crlf& "3 ccc3" &@crlf& _
"4 ddd ? 4" &@crlf&@crlf& "5eee5" &@crlf& "6 fff + 6" &@crlf& "7ggg7"
Msgbox(0,"", $str)
; on enlève les lignes vides ou qui contiennent "bbb" ou "ddd" ou "fff"
$str = _clean($str, "bbb;ddd;fff")
Msgbox(0,"", $str)
Func _clean($txt, $filtre)
$filtre = "\Q" & StringReplace($filtre, ";", "\E|\Q") & "\E"
Return StringRegExpReplace($txt, '(?m)^(\s*|.*(?:' & $filtre & ').*)\R?', "")
EndFunc
Re: Purge et tri d'un fichier log
Posté : sam. 11 juin 2016 20:23
par gothgothhh
Impeccable tout fonctionne sur des roulettes merci bien !
Re: Purge et tri d'un fichier log
Posté : dim. 12 juin 2016 01:37
par walkson
Bonsoir,
Si je peux me permettre une intrusion sur ce post, j'ai quelques questions à poser:
Si je reprends le code de Mikell
Code : Tout sélectionner
$str = "1aaa 1" &@crlf& "2 bb b$ 2" &@crlf&@crlf& "3 ccc3" &@crlf& _
"4 ddd ? 4" &@crlf&@crlf& "5eee5" &@crlf& "6 fff + 6" &@crlf& "7ggg7" & "dd def"
$str = _clean($str, "$;dd d;g")
ConsoleWrite($str & @CR)
Func _clean($txt, $filtre)
$filtre = "\Q" & StringReplace($filtre, ";", "\E|\Q") & "\E"
Return StringRegExpReplace($txt, '(?m)^(\s*|.*(?:' & $filtre & ').*)\R?', "=")
EndFunc
J'obtiens
Je suis d'accord avec le résultat sauf
=1aaa 1
où il me retire quelque chose qui n'existe pas.
Par tâtons, j'ai essayé cela
Code : Tout sélectionner
$str = "1aaa 1" &@crlf& "2 bb b$ 2" &@crlf&@crlf& "3 ccc3" &@crlf& _
"4 ddd ? 4" &@crlf&@crlf& "5eee5" &@crlf& "6 fff + 6" &@crlf& "7ggg7" & "dd def"
$str = _clean($str, "$;dd d;g")
ConsoleWrite($str & @CR)
Func _clean($txt, $filtre)
$filtre = "\Q" & StringReplace($filtre, ";", "\E|\Q") & "\E"
Return StringRegExpReplace($txt, '(?m)^(\s.*|.*(?:' & $filtre & ').*)\R?', "=")
EndFunc
et j'obtiens
Le résultat est convenable mais je ne le comprends pas !
Si quelqu'un peut éclairer ma lanterne ? merci
Re: Purge et tri d'un fichier log
Posté : dim. 12 juin 2016 18:43
par mikell
Ta solution ne convient pas parce qu'elle fait supprimer toute ligne qui commence par un espace, exemple : " 1aaa1"
Le résultat que tu obtiens avec mon code vient du fait que le
\R final est optionnel et donc la 1ère alternative est toujours vraie quelle que soit la ligne (
^\s* : la ligne commence par 0 ou plus espaces) et il y a donc systématiquement un "=" supplémentaire retourné au début
Dans le cas d' une suppression, ça peut être pratique parce que ça permet d'enlever aussi les espaces en début de ligne, et le fait qu'il y ait 2 matches pour la même ligne on s'en fout
Mais si tu veux faire un remplacement, comme mettre un "=" (ou ne pas supprimer les espaces en début de ligne) là c'est différent
On doit laisser le \R optionnel
\R? pour que la dernière ligne puisse être traitée, donc la solution est de lui placer une ancre de fin de ligne
$ juste avant :
StringRegExpReplace($txt, '(?m)^(\s*|.*(?:' & $filtre & ').*)$\R?', "=")
La 1ère alternative ne matche alors que les lignes vides, et ça permet d'obtenir ton résultat convenable
Ouala... si j'ai dit une connerie jchd-sensei me remettra sur les rails

Re: Purge et tri d'un fichier log
Posté : dim. 12 juin 2016 22:08
par gothgothhh
Pour ceux que sa intéresse voilà comment je purge le fichier en supprimant les lignes vides et par detection de keyword
merci mikell !
Code : Tout sélectionner
#include <File.au3>
$file = @ScriptDir & "\log.txt"
$temppurge = @ScriptDir & "\templog.txt"
_Purge($file, "NOFILTERSET");"filter1;filter2"
Func _Purge($filetopurge, $filter) ;Purge blank lines and filter keywords
Local $read = FileRead($filetopurge) ;Read file
If Not @error Then ;Not error
Local $str = _Filter($read, $filter) ;Stock filtered
FileDelete($temppurge) ;Delete temp
FileWrite($temppurge, $str) ;Write filtered to temp
FileClose($read) ;Close file
FileDelete($filetopurge) ;Delete file
FileCopy($temppurge, $filetopurge) ;Copy temp to file
EndIf
EndFunc ;==>_Purge
Func _Filter($txt, $filtre) ;Filter a text with multiple keywords
$filtre = "\Q" & StringReplace($filtre, ";", "\E|\Q") & "\E"
Return StringRegExpReplace($txt, '(?m)^(\s*|.*(?:' & $filtre & ').*)\R?', "")
EndFunc ;==>_Filter
Re: Purge et tri d'un fichier log
Posté : lun. 13 juin 2016 00:37
par Tlem
Bonjour gothgothhh.
Merci de mettre à jour votre adresse mail de contact dans votre profil, car mon hébergeur me signale des rejets de hotmail vous concernant. ^^
Re: Purge et tri d'un fichier log
Posté : lun. 13 juin 2016 01:57
par gothgothhh
Ah oui effectivement je n'ai pas utilisé hotmail depuis des années je vais mettre ma nouvelle desoler ^^
C'est fait !
Re: Purge et tri d'un fichier log
Posté : lun. 13 juin 2016 07:46
par Tlem
Merci
Envoyé de mon appareil mobile avec Tapatalk