Je peux toujours modifier l'encodage des fichiers en les enregistrant avec un qui puisse convener ? Comme ca pas de problem, enfin pas besoin de rajouter des choses dans le script.
Je peux toujours modifier l'encodage des fichiers en les enregistrant avec un qui puisse convener ? Comme ca pas de problem, enfin pas besoin de rajouter des choses dans le script.
Ensuite, ce fichier rule contient également des colonnes avec des valeurs. Tel qu'écrit actuellement, c'est la ligne entière qui sert de clé de recherche, or, ça ne semble pas correct. Quelle est la colonne de rule.txt qui sert de clé de recherche pour le fichier address.txt ?
(problème d'encodage corrigé, je te donnerai la manière de faire après avoir eu la réponse).
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Il va y avoir 2 clefs pour faire la recherche, la colonne Source et la colonne Destination.
edit: en effet, une adresse peut etre soit source soit destination, du moment qu'elle intervient dans RULE, cela veut dire que l'adresse n'est pas inutile, donc elle ne doit pas apparaitre parmi adressuseless.
edit2: du coup il s'agit de 2 colonnes avec potentiellement plusieurs données dans chaque case, comme c'est le cas avec "h-2.2.2.2 group1" pour Destination de l'exemple.
Pourrais-tu clarifier le contenu du fichier rule en indiquant quelles sont les colonnes ?
En effet, on trouve plusieurs fois le mot "Source" et "Destination", séparé avec des espaces et/ou des tabulations. Est-ce que le séparateur de colonne pour tous tes fichiers est <TAB> (le split utilise \s qui contient à la fois <ESPACE> et <TAB>, ce qui ne semble pas correct).
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Je ne sais pas si tu as vu le probleme que j'avais au début du sujet, en fait je pars de fichier .csv, du coup grace à une technique que l'on m'avait donné au depart, à partir d'un fichier txt la selection de la première colonne était possible, sans avoir à passer par spread::sheet, du coup j'ai passé mes fichiers .csv en fichier .txt...
Je ne sais pas si cela vaut le coup ou non de l'avoir fait, personnellement je n'avais pas de preoccupation de fichier source.
Pour les colonnes du coup, je ne sais pas comment excel convertit le .csv en .txt du coup il se peut qu'il ajoute des tab/espace entre les entetes des colonnes...
Sinon les colonnes de mon fichier sont les suivantes :
Num
ID
Logging policy
Action
Source Zone
Source
Destination Zone
Destination
Service
NAT
Comment
Rule Id
Il s'agit des cases de la première ligne d'un fichier .csv.
edit : si je fais un bête copié collé à partir du document cela donne ceci :
Num ID Logging policy Action Source Zone Source Destination Zone Destination Service NAT Comment Rule Id
Je crois que le html du forum reformate la mise en page. Tu veux que je te donne la première ligne sous forme d'un csv ?
Non, des fichiers "texte" avec extension .csv conviennent parfaitement.
C'est donc bien cela : les colonnes sont séparées par des TAB et non des espaces.Pour les colonnes du coup, je ne sais pas comment excel convertit le .csv en .txt du coup il se peut qu'il ajoute des tab/espace entre les entetes des colonnes...
Sinon les colonnes de mon fichier sont les suivantes :
Num
ID
Logging policy
Action
Source Zone
Source
Destination Zone
Destination
Service
NAT
Comment
Rule Id
Il s'agit des cases de la première ligne d'un fichier .csv.
Maintenant, dans le fichier rule, quelles sont les colonnes dont il faut enregistrer les valeurs pour le filtrage des adresses ?
Est-ce "Source" et "Destination" ?
Si c'est bien le cas, dans la première ligne de rule.txt, la destination est "h-2.2.2.2 Group1", c'est à dire une destination en 2 mots. Faut-il enregistrer "h-2.2.2.2 Group1" ou seulement "h-2.2.2.2" ? et comment savoir ce qu'il faut retirer d'une adresse si elle contient plusieurs "mots" ?
PS : merci de ne pas mettre à jour tes posts en complétant la réponse, mais ajoute de nouveaux posts, car je ne suis pas notifié des mises à jour.
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Désolé pour les edits nombreux, j'ai pour habitude d'éviter au maximum les double posts (habitude des forums...).
Alors il faut récupérer comme tu le dis "Source" et "Destination" dans le hash ( si j'ai bien compris) pour ensuite rechercher (dansle premier cas) quels sont les noms d'adresses donc h-1.1.1.1 ou h-2.2.2.2 et non pas 1.1.1.1 ou 2.2.2.2 (je ne tiens compte que des "noms", c'est pour cela que je récupère que la première colonne du fichier address).
Cependant pour le deuxième cas, ce qui m'intéresse avec les groups c'est de voir quels sont les groupes presents dans RULE. Du coup c'est bien "group 1" ou "groupe 2" qui vont m'etre utile.
Sinon, je n'ai pas bien compris cela :
et comment savoir ce qu'il faut retirer d'une adresse si elle contient plusieurs "mots" ?
Regarde bien la première règle du fichier rule.txt, et dis moi que contient la colonne Destination, stp.
Idem pour la 2e ligne d'ailleurs.
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Voici l'état actuel du script :
Cependant, comme demandé dans le post précédent, il semble y avoir des "intrus" dans la colonne "Destination" de rule.txt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 use strict; use warnings; open my $RULE, "<", "rule.txt" or die "Can't open rule.txt for reading: $!"; binmode $RULE, ":encoding(utf-16):crlf"; my %rule; <$RULE>; # Ignore the first line while (defined(my $rule = <$RULE>)) { chomp($rule); my ($source, $destination) = (split /\t/, $rule)[5,7]; $rule{$source}++ if defined $source; $rule{$destination}++ if defined $destination; } open (my $ADDRESS, "<", "address.txt") or die "can't open address.txt for reading: $!"; binmode $ADDRESS, ":encoding(utf-16):crlf"; open (my $FICHIER1,">", "addressuseless.txt") or die "Can't open addressuseless.txt for writing: $!"; binmode $FICHIER1, ":encoding(utf-16):crlf"; print { $FICHIER1 } scalar(<$ADDRESS>); # Read and write the first line while (defined(my $address = <$ADDRESS>)) {#trouver toutes les adresses de ADDRESS qui ne sont pas dans RULE et les stocker dans FICHIER1 chomp($address); if (defined(my $out = (split /\s+/, $address)[0])) { if (exists $rule{$out}) { print { $FICHIER1 } "address found \n"; # à supprimer par la suite, n'est là que pour savoir si la condition passe ou pas } else{ print $out, "\n"; print { $FICHIER1 } $out, "\n" ; } } else { print "No address found at line $. [$address]\n"; } } open (my $ADDRESSGROUP,"<", "addressgroup.txt") or die "Can't open addressgroup.txt for reading: $!"; binmode $ADDRESSGROUP, ":encoding(utf-16):crlf"; open (my $FICHIERGROUP,">", "fichiergroup.txt") or die "Can't open fichiergroup.txt for writing: $!"; binmode $FICHIERGROUP, ":encoding(utf-16):crlf"; #trouver tous les groupes d'adresses qui sont dans RULE et les stocker dans FICHIERGROUP while (defined(my $addressgroup = <$ADDRESSGROUP>)) { chomp($addressgroup); my ($out2, $out3) = (split /\s+/, $addressgroup)[0,1]; if (defined $out2) { print $out2, "\n"; if (exists $rule{$out2}){ print $out2, "\n"; # WHY WRITING AGAIN out2 ??? if (defined $out3) { print { $FICHIERGROUP } $out3, "\n"; } else { print "No zone found at line $. in addressgroup.txt [$addressgroup]\n"; } } } else { print "No group found at line $. in addressgroup.txt [$addressgroup]"; } } close($ADDRESSGROUP); close($FICHIERGROUP);
- 1ere ligne : l'adresse h-2.2.2.2 est suivie de " Group1"
- 2e ligne : l'adresse h-2.2.2.2 est suivie de " " (espace).
C'est information parasites sont enregistrées dans le hash %rule si l'on ne peut pas les filtrer. C'était l'objet de ma question "comment savoir ce qu'il faut retirer d'une adresse si elle contient plusieurs "mots" ?"
Edit : ce sera tout pour ce soir. A demain.
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Tout d'abord merci beaucoup pour le temps que tu me consacres ^^.
Je ne pensais pas que le fait d'avoir dans un hash "h-2.2.2.2 Groupe1" posait problème, mais c'est du à mon ignorance dans le perl. En effet, je pensais que si tu cherchais "h-2.2.2.2" dans par exemple "h-2.2.2.2 Groupe1" ou bien même "h-2.2.2.2 " (donc avec un espace) le "exists" retournait Vrai et permettait alors de passer le "if" vu qu'un partie du hash contenait l'élément recherché.
Vu que ce n'est pas le cas, je pense qu'il va falloir comme tu l'as fait, et je te remercie pour l'aide à coder le script, récupérer les colonnes 5 et 7, et appliquer aux hashs la suppression des espaces et des tab par des s///.
Du coup, si on considère le cas "h-2.2.2.2 Group1", on obtient une base de hashs composée de "h-2.2.2.2" et "Group1" et ensuite, il suffit de comparer les éléments de la colonne 1 de ADDRESS à ces hashs.
Ce que l'on pourrait faire autrement c'est stocker dans un fichier tous les éléments des colonnes 5 et 7 et appliquer à ce fichier les modifications nécessaires pour avoir quelque chose d'homogène, et ensuite stocker le résultat dans un hash pour le réutiliser et faire les comparaisons.
Merci aussi pour la gestion de l'encodage je n'y aurais jamais pensé.
J'ai testé en ajoutant ceci entre le premier if qui définit le $out et le 2ème if avec le exists donc entre la ligne 22 et 23 de code :
et cela a l'air de fonctionner maintenant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $out=~ s/\s+/\n/g;
edit: par contre, je rencontre des problèmes pour normliser out2 et out3...j'y travaille ^^.
edit2: en fait, ma technique ne fonctionne pas s'il y a plus de 2 données dans une colonne. En effet, je me demandais pourquoi cela ne fonctionnait pas pour out2 et ou3 alors qu'il s'agissait finalement de la meme chose. En fait, avec le hash on n'arrive qu'à détecter h-1.1.1.1 et non pas le Groupe1 qui se situe après. Du coup, pas moyen de faire une comparaison.
J'ai vérifié cela en ajoutant après h-2.2.2.2 dans Destination l'adresse h-1.1.1.1 du coup on a "h-2.2.2.2 h-1.1.1.1" et en supprimant toutes les autres apparitions de h-1.1.1.1 dans RULE. Et dans ce cas h-1.1.1.1 n'est pas considéré comme étant dans le hash. Du coup c'est au niveau de la définition du hash de rule qu'il faut régler le problème et appliquer ceci "=~ s/\s+/\n/g;".
Pour traiter, dans le fichier rule.txt, une adresse de destination du type "h-2.2.2.2 Group1" comme deux adresses "h-2.2.2.2" et "Group1", il suffit de splitter avant de renseigner le hash avec une clé. Au passage, on filtrera les adresses qui seraient vides (ce qui règlera le pb lié à une adresse se terminant par un espace).
Ceci donne cela pour la partie de la lecture du fichier rule.txt:
Pour le tableau des groupes, il faudra peut-être utiliser une technique similaire (à voir cet aprèm).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 while (defined(my $rule = <$RULE>)) { chomp($rule); my ($source, $destination) = (split /\t/, $rule)[5,7]; foreach my $address_field (grep defined, $source, $destination) { foreach my $address (grep $_, split /\s+/, $address_field) { $rule{$address}++; } } }
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Bon ba j'ai essayé pendant 1h30 d'obtenir ton résultat sans succes... Du coup merci beaucoup.
Voici où j'en suis niveau code, il ne reste je pense qu'à régler le problème du $out3 qui n'inscrit pas toutes les adresses de la colonne [1] du fichier addressgroup.
edit : il se peut que tu trouves des choses modifiées inutiles dans le code que je viens de poster, comme par exemple les definitions de $out2 et $out3 qui sont dissociées, mais comme je ne suis pas encore très à l'aise avec les notations, lorsque je j'essaye de débugguer le script, j'essaye de simplifier ma vision des différents elements ^^. Du coup, ce n'est en aucun cas parce que je n'aime pas la double definition mais parce que j'ai eu besoin de différencier les 2 cas pour faire des tests.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 use strict; use warnings; open my $RULE, "<", "rule.txt" or die "Can't open rule.txt for reading: $!"; binmode $RULE, ":encoding(utf-16):crlf"; my %rule; #<$RULE>; # Ignore the first line while (defined(my $rule = <$RULE>)) { chomp($rule); my ($source, $destination) = (split /\t/, $rule)[5,7]; foreach my $address_field (grep defined, $source, $destination) { foreach my $address (grep $_, split /\s+/, $address_field) { $rule{$address}++; } } } open (my $ADDRESS, "<", "address.txt") or die "can't open address.txt for reading: $!"; binmode $ADDRESS, ":encoding(utf-16):crlf"; open (my $FICHIER1,">", "addressuseless.txt") or die "Can't open addressuseless.txt for writing: $!"; binmode $FICHIER1, ":encoding(utf-16):crlf"; print { $FICHIER1 } scalar(<$ADDRESS>); # Read and write the first line while (defined(my $address = <$ADDRESS>)) {#trouver toutes les adresses de ADDRESS qui ne sont pas dans RULE et les stocker dans FICHIER1 chomp($address); if (defined(my $out = (split /\s+/, $address)[0])) { if (exists $rule{$out}) { print { $FICHIER1 } "address found \n"; # à supprimer par la suite, n'est là que pour savoir si la condition passe ou pas } else{ print $out, "\n"; print { $FICHIER1 } $out, "\n" ; } } else { print "No address found at line $. [$address]\n"; } } open (my $ADDRESSGROUP,"<", "addressgroup.txt") or die "Can't open addressgroup.txt for reading: $!"; binmode $ADDRESSGROUP, ":encoding(utf-16):crlf"; open (my $FICHIERGROUP,">", "fichiergroup.txt") or die "Can't open fichiergroup.txt for writing: $!"; binmode $FICHIERGROUP, ":encoding(utf-16):crlf"; #trouver tous les groupes d'adresses qui sont dans RULE et les stocker dans FICHIERGROUP while (defined(my $addressgroup = <$ADDRESSGROUP>)) { chomp($addressgroup); my $out2=(split /\s+/, $addressgroup)[0]; my $out3 = (split /\s+/, $addressgroup)[1]; if (defined $out2) { if (exists $rule{$out2}){ print $out2, " cela match \n"; # WHY WRITING AGAIN out2 ??? if (defined $out3) { print { $FICHIERGROUP } $out3, "\n"; } else { print "No zone found at line $. in addressgroup.txt [$addressgroup]\n"; } } } else { print "No group found at line $. in addressgroup.txt [$addressgroup]"; } } close($ADDRESSGROUP); close($FICHIERGROUP);
A la ligne 25, comme ton fichier address.txt est aussi un CSV dont les colonnes sont séparées par des TAB, je t'invite à faire la modification suivante :
Au lieu de
écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (defined(my $out = (split /\s+/, $address)[0])) {
(comme c'est dans la version du script que j'ai postée).
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (defined(my $out = (split /\t+/, $address)[0])) {
Et également pour le calcul de out2 et out3 :
à remplacer par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my $out2=(split /\s+/, $addressgroup)[0]; my $out3 = (split /\s+/, $addressgroup)[1];
ou plus simplement par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my $out2=(split /\t+/, $addressgroup)[0]; my $out3 = (split /\t+/, $addressgroup)[1];
Enfin, comme pour le fichier address.txt, il faut copier "texto" la première ligne qui n'est qu'un entête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part my ($out2, $out3) =(split /\t+/, $addressgroup)[0,1];
Quand au fait que le filtre puisse ne pas fonctionner pour les groupes, il s'avère que dans ton fichier address.txt, "Group1" s'écrit sans le "e" à groupe, alors que dans le fichier addressgroup.txt, il s'écrit "Groupe1"... => pas de match.
Le script tel qu'il est actuellement chez moi :
Si tu as des questions sur la syntaxe utilisée, n'hésite pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 use strict; use warnings; open my $RULE, "<", "rule.txt" or die "Can't open rule.txt for reading: $!"; binmode $RULE, ":encoding(utf-16):crlf"; my %rule; <$RULE>; # Ignore the first line while (defined(my $rule = <$RULE>)) { chomp($rule); my ($source, $destination) = (split /\t/, $rule)[5,7]; foreach my $address_field (grep defined, $source, $destination) { foreach my $address (grep $_, split /\s+/, $address_field) { $rule{$address}++; } } } open (my $ADDRESS, "<", "address.txt") or die "can't open address.txt for reading: $!"; binmode $ADDRESS, ":encoding(utf-16):crlf"; open (my $FICHIER1,">", "addressuseless.txt") or die "Can't open addressuseless.txt for writing: $!"; binmode $FICHIER1, ":encoding(utf-16):crlf"; print { $FICHIER1 } scalar(<$ADDRESS>); # Read and write the first line while (defined(my $address = <$ADDRESS>)) {#trouver toutes les adresses de ADDRESS qui ne sont pas dans RULE et les stocker dans FICHIER1 chomp($address); if (defined(my $out = (split /\t+/, $address)[0])) { if (exists $rule{$out}) { print { $FICHIER1 } "address found \n"; # à supprimer par la suite, n'est là que pour savoir si la condition passe ou pas } else{ print $out, "\n"; print { $FICHIER1 } $out, "\n" ; } } else { print "No address found at line $. [$address]\n"; } } open (my $ADDRESSGROUP,"<", "addressgroup.txt") or die "Can't open addressgroup.txt for reading: $!"; binmode $ADDRESSGROUP, ":encoding(utf-16):crlf"; open (my $FICHIERGROUP,">", "fichiergroup.txt") or die "Can't open fichiergroup.txt for writing: $!"; binmode $FICHIERGROUP, ":encoding(utf-16):crlf"; print { $FICHIERGROUP } scalar(<$ADDRESSGROUP>); #trouver tous les groupes d'adresses qui sont dans RULE et les stocker dans FICHIERGROUP while (defined(my $addressgroup = <$ADDRESSGROUP>)) { chomp($addressgroup); my ($out2, $out3) = (split /\t+/, $addressgroup)[0,1]; if (defined $out2) { print $out2, "\n"; if (exists $rule{$out2}){ print $out2, "\n"; # WHY WRITING AGAIN out2 ??? if (defined $out3) { print { $FICHIERGROUP } $out3, "\n"; } else { print "No zone found at line $. in addressgroup.txt [$addressgroup]\n"; } } } else { print "No group found at line $. in addressgroup.txt [$addressgroup]"; } } close($ADDRESSGROUP); close($FICHIERGROUP);
Pour l'affectation de liste, comme celle-ci :
elle résulte du fait que l'opérateur "=" (affectation) accepte que l'opérande de gauche (left-value) soit une liste (une variable tableau, ou hash, ou bien une liste de scalaire comme ici). Du coup, l'opérande de droite (right-value) est considéré comme une liste. Si la liste de droite est plus courte que la liste de gauche, les valeurs supplémentaires seront affectées à undef, si c'est l'inverse, les valeurs à affecter seront ignorées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part my ($out2, $out3) = (split /\t/, $addressgroup)[0,1];
A droite de mon expression, on trouve :
Ce qui signifie que l'on réalise un split, qui fournit une liste, et dont on récupère le premier et le 2e élément pour former une liste à fournir à l'opérateur =.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (split /\t/, $addressgroup)[0,1];
En espérant avoir été plus clair
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Merci beaucoup pour ta réponse très complete.
En fait quand je parlais de la separation entre les $out2 et $out3 c'était concernant l'argument du split. En effet je voulais tester la difference entre \t+ et \s+. Du coup pour le faire, je ne me suis pas pris la tête j'ai séparé en 2 lignes ^^. Et ayant aussi effectué par la suite des modifications que sur $out3 et non pas sur $out2 pour essayer d'obtenir un résultat, la separation me simplifiait un peu la vie.
Etant donné qu'il fallait appliquer \t aux 2 la separation ne sert plus à rien et je n'ai plus de test à faire de ce coté là, je réunis, et je me retrouve donc avec la même chose que toi.
Pour l'histoire du Group1 et Groupe1 effectivement je l'ai remarqué hier soir, mais j'ai oublié de te le préciser et je m'en excuse...le problème venait donc que de mes arguments du split.
Bon j'ai par contre encore quelques questions...
Tout d'abord, nous pouvons dorénavant supprimer les lignes 50 et 52, enfin elles me permettaient comme je te l'avais dit de débugguer, ce qui n'est plus nécessaire.
Ensuite, pour la ligne 27 que je tenais tant à mettre, je vais du coup la passer en commentaire, et la remplacer par une ligne permettant d'effacer l'adresse qui a match afin de ne pas en tenir compte. Du coup je ne sais pas si en perl il existe une possibilité de ne rien faire et de passer au test suivant. Pourquoi un tel choix alors que je pourrais prendre la negation du "exists", tout simplement parce que je ne veux pas perdre la ligne avec le "address found".
Enfin, comme je te l'avais dit hier, je voudrais rajouter ces lignes de codes à la suite du fichier pour obtenir un résultat. Tout se passé bien pour la première étape, mais la creation du fichier DONNEE ne me donne que des GLOB(hexa).... Je ne sais pas du tout ce dont il s'agit.
Je n'ai pas mis de "my" après certains open car l'entité avait déjà été créée auparavant. J'ai d'ailleurs une question sur ce point là, quand on fait un open sur une entité (donc un nouveau my), le CLOSE ne détruit donc pas la signification de l'entité ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 open ($FICHIERGROUP, "<", "fichiergroup.txt") or die "can't read $!"; binmode $FICHIERGROUP, ":encoding(utf-16):crlf"; open (my $FICHIERGROUPALALIGNE, ">", "fichiergroupalaligne.txt") or die "can't create $!"; binmode $FICHIERGROUPALALIGNE, ":encoding(utf-16):crlf"; while(<$FICHIERGROUP>){#passe à la ligne à chaque nouvelle adresse chomp($_); $_=~ s/\s+/\n/g; print {$FICHIERGROUPALALIGNE} $_, "\n"; } close($FICHIERGROUP); close($FICHIERGROUPALALIGNE); open($FICHIERGROUPALALIGNE,"<","fichiergroupalaligne.txt") or die "can't read $!"; binmode $FICHIERGROUPALALIGNE, ":encoding(utf-16):crlf"; open(my $DONNEE, ">", "donnee.txt") or die "can't create $!"; binmode $DONNEE, ":encoding(utf-16):crlf"; while(<$FICHIERGROUPALALIGNE>){#supprime les lignes vides next if /^\s*$/; print $DONNEE; } close($FICHIERGROUPALALIGNE); close($DONNEE);
Merci d'avance.
edit: j'avais une autre petite question, depuis le début quand je lance le script j'ai un caractère qui apparait devant NAME IP Address etc... et je le traine ensuite tout le temps, c'est certes être pointilleux, mais je voulais savoir de 1) s'il provenait du fait de l'encodage, et de 2) il y a moyen de l'enlever ? En effet, on effectue un read and write de la première ligne du coup je ne sais pas trop comment gérer sa suppression.
OK, je modifie mes fichiers de test pour avoir la même chaine dans les 2 fichiers.
Maintenant, voyons chaque problème l'un après l'autre si tu veux bien
Problème 1
Problème 2Ensuite, pour la ligne 27 que je tenais tant à mettre, je vais du coup la passer en commentaire, et la remplacer par une ligne permettant d'effacer l'adresse qui a match afin de ne pas en tenir compte. Du coup je ne sais pas si en perl il existe une possibilité de ne rien faire et de passer au test suivant. Pourquoi un tel choix alors que je pourrais prendre la negation du "exists", tout simplement parce que je ne veux pas perdre la ligne avec le "address found".
Problème 3Enfin, comme je te l'avais dit hier, je voudrais rajouter ces lignes de codes à la suite du fichier pour obtenir un résultat. Tout se passé bien pour la première étape, mais la creation du fichier DONNEE ne me donne que des GLOB(hexa).... Je ne sais pas du tout ce dont il s'agit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 open ($FICHIERGROUP, "<", "fichiergroup.txt") or die "can't read $!"; binmode $FICHIERGROUP, ":encoding(utf-16):crlf"; open (my $FICHIERGROUPALALIGNE, ">", "fichiergroupalaligne.txt") or die "can't create $!"; binmode $FICHIERGROUPALALIGNE, ":encoding(utf-16):crlf"; while(<$FICHIERGROUP>){#passe à la ligne à chaque nouvelle adresse chomp($_); $_=~ s/\s+/\n/g; print {$FICHIERGROUPALALIGNE} $_, "\n"; } close($FICHIERGROUP); close($FICHIERGROUPALALIGNE); open($FICHIERGROUPALALIGNE,"<","fichiergroupalaligne.txt") or die "can't read $!"; binmode $FICHIERGROUPALALIGNE, ":encoding(utf-16):crlf"; open(my $DONNEE, ">", "donnee.txt") or die "can't create $!"; binmode $DONNEE, ":encoding(utf-16):crlf"; while(<$FICHIERGROUPALALIGNE>){#supprime les lignes vides next if /^\s*$/; print $DONNEE; } close($FICHIERGROUPALALIGNE); close($DONNEE);
Problème 4Je n'ai pas mis de "my" après certains open car l'entité avait déjà été créée auparavant. J'ai d'ailleurs une question sur ce point là, quand on fait un open sur une entité (donc un nouveau my), le CLOSE ne détruit donc pas la signification de l'entité ?
Je vais commencer par une partie du problème 3.edit: j'avais une autre petite question, depuis le début quand je lance le script j'ai un caractère qui apparait devant NAME IP Address etc... et je le traine ensuite tout le temps, c'est certes être pointilleux, mais je voulais savoir de 1) s'il provenait du fait de l'encodage, et de 2) il y a moyen de l'enlever ? En effet, on effectue un read and write de la première ligne du coup je ne sais pas trop comment gérer sa suppression.
Lorsque tu utilises une variable scalaire (commençant par le sigil $) pour y mettre un FILE HANDLE (à la place d'un TYPEGLOB), il suffit alors d'indéfinir la variable concernée pour fermer le fichier. En revanche, ferme le fichier avec close n'indéfini pas la variable, qui continue de contenir une valeur.
Or, la fonction open, lorsqu'elle est utilisée avec un scalaire en 1er paramètre, créée un nouveau FILE HANDLE si et uniquement si la variable est indéfinie. Dans le cas contraire, elle ré-utilise le FILE HANDLE contenu dans ce paramètre. Dans ce contexte, il est préférable d'indéfinir la variable du FILE HANDLE si l'on souhaite la réutiliser pour ouvrir un autre fichier, ce qui du coup, ferme également le fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 undef $ADDRESS; # ferme le fichier $ADDRESS et met undef dans $ADDRESS close $ADDRESS; # ferme le fichier $ADDRESS mais n'affecte pas $ADDRESS
Code : Sélectionner tout - Visualiser dans une fenêtre à part undef $ADDRESS;
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Problème 4 :
Les caractères de début de fichier semblent être des caractères liés à Windows. Ils sont présents dans les fichiers address.txt et addressgroup.txt (en entrées) et donc reproduits tels quels en sortie. Ce caractère spécial, sert en fait à définir l'ordre des octets pour les caractères unicode à plusieurs octets, comme c'est le cas pour l'encodage utilisé UTF-16 (2 octets). Du coup, comme on produits des fichiers dans le même encodage, il me parait nécessaire de conserver ce caractère, qui sans doute, disparaitra en ouvrant les fichiers depuis Excel.
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Problème 2 :
J'ai remplacé tes deux boucles de la fin par le traitement dans l'écriture du fichier fichiergroup.txt de la mise à la ligne de chaque adresse, et de la suppression des adresses "vides".
Ce qui donne ceci comme ligne d'écriture :
Il s'agit ici d'un "pipeline" d'opérations (d'abord à droite, le split qui sépare les mots séparés par au moins un espace ou tabulation, ensuite, le grep qui filtre les mots de taille nulle, et enfin le map qui ajoute un \n à la fin de chacun d'eux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part print { $FICHIERGROUP } map "$_\n", grep length, split /\s+/, $out3;
Script final actuel :
Pour le problème 1, je crois que je n'ai pas compris le besoin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 use strict; use warnings; open my $RULE, "<", "rule.txt" or die "Can't open rule.txt for reading: $!"; binmode $RULE, ":encoding(utf-16):crlf"; my %rule; <$RULE>; # Ignore the first line while (defined(my $rule = <$RULE>)) { chomp($rule); my ($source, $destination) = (split /\t/, $rule)[5,7]; foreach my $address_field (grep defined, $source, $destination) { foreach my $address (grep $_, split /\s+/, $address_field) { $rule{$address}++; } } } open (my $ADDRESS, "<", "address.txt") or die "can't open address.txt for reading: $!"; binmode $ADDRESS, ":encoding(utf-16):crlf"; open (my $FICHIER1,">", "addressuseless.txt") or die "Can't open addressuseless.txt for writing: $!"; binmode $FICHIER1, ":encoding(utf-16):crlf"; print { $FICHIER1 } scalar(<$ADDRESS>); # Read and write the first line while (defined(my $address = <$ADDRESS>)) {#trouver toutes les adresses de ADDRESS qui ne sont pas dans RULE et les stocker dans FICHIER1 chomp($address); if (defined(my $out = (split /\t/, $address)[0])) { if (exists $rule{$out}) { print { $FICHIER1 } "address found \n"; # à supprimer par la suite, n'est là que pour savoir si la condition passe ou pas } else{ print $out, "\n"; print { $FICHIER1 } $out, "\n" ; } } else { print "No address found at line $. [$address]\n"; } } open (my $ADDRESSGROUP,"<", "addressgroup.txt") or die "Can't open addressgroup.txt for reading: $!"; binmode $ADDRESSGROUP, ":encoding(utf-16):crlf"; open (my $FICHIERGROUP,">", "fichiergroup.txt") or die "Can't open fichiergroup.txt for writing: $!"; binmode $FICHIERGROUP, ":encoding(utf-16):crlf"; print { $FICHIERGROUP } scalar(<$ADDRESSGROUP>); #trouver tous les groupes d'adresses qui sont dans RULE et les stocker dans FICHIERGROUP while (defined(my $addressgroup = <$ADDRESSGROUP>)) { chomp($addressgroup); my ($out2, $out3) = (split /\t/, $addressgroup)[0,1]; if (defined $out2) { print $out2, "\n"; if (exists $rule{$out2}){ print $out2, "\n"; # WHY WRITING AGAIN out2 ??? if (defined $out3) { print { $FICHIERGROUP } map "$_\n", grep length, split /\s+/, $out3; } else { print "No zone found at line $. in addressgroup.txt [$addressgroup]\n"; } } } else { print "No group found at line $. in addressgroup.txt [$addressgroup]"; } } undef $ADDRESSGROUP; undef $FICHIERGROUP;
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Pour le problème 3: merci beaucoup pour l'explication, c'est bien plus clair maintenant, j'avais complétement zappé le fait que la variable pouvait poser problème et qu'en fermant le fichier, cela rendait undef la varaiable. Du coup, cela répond très bien à mon problème.
Pour le problème 4: ok on peut le laisser, cela ne pose pas de problème, je travaille sur une machine virtuelle via putty, du coup je n'ai fait qu'afficher qu'avec des cat les txt et le caractère apparaissait. S'il se supprime en les ouvrant avec excel tant mieux, sinon ce n'est pas grave ^^.
Ok, tout marche parfaitement ! Merci beaucoup, ta technique est bcp plus rapide que la mienne.
Cocnernant le problème 1, en fait il n' y a pas de problème, il suffit juste de passer en commentaire la ligne avec le "address found" et cela fonctionne. Je ne savais pas si en perl lorsque l'on laissait un if vide cela posait problème, apparemment non.
Le but de concerver ce commentaire dans la boucle est d'avoir la possibilité de comparer en fait le fichier d'origine et la résultat, pour connaitre les adresses qui ne sont pas inutiles... Cela depend de ce que je veux en fait, si je ne cherche que les adresses inutiles, je n'ai pas besoin d'avoir les "address found" de partout. Tu vois ce que je veux dire ?
Bon, je suis en train d'essayer de coder un dernier "module" pour voir si j'arrive à me familiariser avec les hash. Je te tiens au courant.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager