Bonsoir tout le monde
petit rappel valant son pesant de ce que vous voulez :
^ signifie début du bloc d'info, donc si c'est une ligne, c'est le début de ligne, mais si c'est un gros bloc de plusieur ligne, alors ce ne sera que le début de ce bloc
$ idem pour la fin
\s espace+tab verticale (si si ça existe) et horizontale ET retour chariot
Maintenant pour décomposer un fichier host, voici 2 méthode, dont la première redécoupée en 2 (vous verrez pourquoi dans les commentaires)
le but étant d'isoler les lignes de type xxx.xxx.xxx.xxx nom_machine #commentaire
après faudra passer par du stringsplit pouravoir des tableaux si ça vous dit
notez qu'on peut remplacer dans la suit \x0d et \x0a respectivment par \r \n
#include <Array.au3>
$title = " my_host.txt "
; version un gros bloc
, gardez à l'esprit que ^ désignera le début du bloc et
$ la fin du bloc
, pas les début et fin de ligne !
$host_file = FileRead
( $title )
$list_host = StringRegExp
( $host_file , "
( \d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}.*
) "
, 3 )
_ArrayDisplay
( $list_host , " méthode gros bloc "
)
;inconvénient
, on s'embarque les exemple qui ne peuvent être filtrés ainsi et les carrés que
;vous voyez sont les \r du retours chariot
, car . veut dire tout sauf \n
, et un retours chariot
;dans windows c'est \r\n d'où ce reliquat
, nous verrons juste après coment y remédier
; et après on gère avec du stringsplit dérière si on veut redécouper ...
;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; toujours méthode
1 mais sans les \r :
$title = " my_host.txt "
; version un gros bloc
, gardez à l'esprit que ^ désignera le début du bloc et
$ la fin du bloc
, pas les début et fin de ligne !
$host_file = FileRead
( $title )
$list_host = StringRegExp
( $host_file , "
( \d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}[^\x0d\x0a]*
) "
, 3 )
;on remplace .* par [\x0d\0a]* ce qui veut dire tout sauf \r
( = 0x0d
) et \n
( = 0x0a
)
_ArrayDisplay
( $list_host , " méthode gros bloc sans \r "
)
;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; toujours méthode
1 mais sans les \r ni les lignes d'exemples contenant des ip :
$title = " my_host.txt "
; version un gros bloc
, gardez à l'esprit que ^ désignera le début du bloc et
$ la fin du bloc
, pas les début et fin de ligne !
$host_file = FileRead
( $title )
$list_host = StringRegExp
( $host_file , " [^\x0d\x0a]*\s*
( \d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}[^\x0d\x0a]*
) "
, 3 )
;même méthode que tout à l'heure
, mais à l'avant. Comme nous somme dans un gros bloc
, on lui dit :
;on choisit qq chose qui ne commence pas par un retour chariot
( du coups on indique une nlle ligne
)
;suivit d'éventuellement d'espaces
, tab etc ... sauf
( retour chariot puisqu'on les a banni avant ^^
;puis commence la sélection grâce aux parenthèses
, et le reste c'est le cas précédent.
_ArrayDisplay
( $list_host , " méthode gros bloc sans \r et exemple commentés éventuels "
)
;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
;méthode ligne par ligne
, c'est pareil
, mais la différence est que
1 bloc
= 1 ligne et donc ici ça coincide
$host_file = FileOpen
( $title , 0 )
$delimiteur = @crlf; je vais passer par la construction d'une string qu'on splitera grâce à ce délimiteur
;vu qu'on n'embarque pas de retours chariot
, on élimine les risques de colisions
; sinon cf une autre méthode sur les tableau dynamique qq posts plus bas
$ligne_host = " "
While
1
$ligne = FileReadLine
( $host_file )
if @error
= -
1 Then ExitLoop
$list_host = StringRegExp
( $ligne , " ^\s*
( \d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}.*
) $ "
, 3 )
;là par contre le fait de dire je sélectionne ce qui commence par
1 ou plusieur espace suivit de
1 à
3 digit
;enlève le pb des commentaires
If IsArray
( $list_host ) Then
$ligne_host& = $list_host[0]&$delimiteur
WEnd
$list_host = StringSplit
( $ligne_host , @CRLF
, 1 )
_ArrayDisplay
( $list_host , " méthode ligne par ligne "
)
FileClose
( $host_file )
Exit
0
[edit]
et un dernier un méthode 2 de regexp pour faire une sélection sur les 3 infos à recueillir en même temps :
;méthode ligne par ligne
, c'est pareil
, mais la différence est que
1 bloc
= 1 ligne et donc ici ça coincide
$host_file = FileOpen
( $title , 0 )
While
1
$ligne = FileReadLine
( $host_file )
If @error
= -
1 Then ExitLoop
$nOffset = 1
While
1
$list_host = StringRegExp
( $ligne , " ^\s*
( \d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}\.\d{1
, 3}
) \s*
( \S*
) \s*
( .*
) $ "
, 2 , $nOffset )
If @error
= 0 Then
$nOffset = @extended
Else
ExitLoop
EndIf
For $i = 0 To UBound
( $list_host ) -
1
MsgBox
( 0 , " RegExp Test with Option
1 - "
& $i , $list_host[$i] )
Next
WEnd
WEnd
FileClose
( $host_file )
Exit
0
^\s* : comme on es en ligne par ligne, celà signifie ce qui commence depuis le début de ligne par 0 ou plusière espace, tab ...
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) puis par xxx.xxx.xxx.xxx avec xxx pouvant être 1 à 3 digits que je sélectionne grâce aux ()
\s* : suivi de 0 ou plusieur espaces, tab ... que je ne sélectionne pas
(\S*) : suivi d'une chaine de caractère ne comprenant pas d'espace, et que je sélectionne
\s* : suivi de 0 ou plusieurs espaces tab ... que je ne sélectionne pas
(.*)$ : et tout le reste jusqu'à la fin que je sélectionne
donc comme on peut le voir on il ya pleins de façons différentes d'arriver au résultat ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.