IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Découper fichier excel ou .csv


Sujet :

Langage Perl

  1. #41
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Bon apparemment, je ne suis pas encore très à l'aise avec toutes ces nouvelles notions...

    Le principe du dernier module est le suivant : supprimer du fichier adressuseless.txt les adresses qui sont presents dans fichiergroup.txt . Bon mis à part m'effacer totalement mon fichier addressuseless cela ne fait pas grand chose. Voici le code :

    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
     
    undef $FICHIERGROUP;
    undef $FICHIER1; 
     
    open(my $FICHIERGROUP, "<","fichiergroup.txt") or die "can't read $!";
    binmode $FICHIERGROUP, "encoding(utf-16):crlf";
    open(my $FICHIER1, ">", "addressuseless.txt") or die "can't write $!";
    binmode $FICHIER1, "encoding(utf-16):crlf";
    my %list;
    while(defined(my $list = <$FICHIERGROUP>)) {
    	chomp($list);
    	$list{$list}++;
    }
    while(defined(my $adress2=<$FICHIER1>)) {
    	chomp($adress2);
    	if (exists $list{$adress2}){
    		print {$FICHIER1} "adress found \n"; 
    	}
    	else{	
    		print {$FICHIER1} $adress2, "\n";
    	}
    }
    close($FICHIERGROUP);
    close($FICHIER1);
    edit : c'est peut etre un peu tard pour le dire, mais étant sur un ordinateur anglais, il y a des corrections syntaxiques automatiques, du coup il se peut que des mots comme "problème" se transforme en "problem" etc... j'en suis désolé...


    edit 2: heu...je crois qu'il faut enlever les 2 "my" un copié collé qui n'est pas bien passé.

  2. #42
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Un point : tu oublies toujours d'ignorer la première ligne d'entête des fichiers lus

    Sinon, y a-t-il un problème particulier avec ce que tu as écrit ? (certes, on pourrait sans doute faire cette opération, ou la préparer, dans les étapes précédentes, mais pour l'instant, je ne vois pas d'erreur à la traiter "à part").
    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

  3. #43
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Les 2 fichiers que je prends en compte sont addessuseless donc je ne dois pas tenir compte de la première ligne, vu qu'elle contient NAME etc... mais pour fichiergroup je ne peux as me passer de la première ligne vu qu'il commence par une adresse IP ? D'ailleurs je viens d'y penser mais le caractère bizarre de début de fichier pourrait poser ici porblème dans ma comparaison non ?

    Pour cette étape, je souhaitais reutiliser un peu les connaissances que j'avais pu acquérir pour rajouter une autre comparaison entre les 2 fichiers que l'on avait fait.

    Concernant sa place en lui meme dans le code...pas d'importance, je trouvais simplement plus simple de le faire à la fin étant pragmatique ^^.

  4. #44
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Sinon, y a-t-il un problème particulier avec ce que tu as écrit ?
    Enfin je ne suis pas sur d'avoir bien compris la question en fait... si tu parles d'un point de vue code, le problème est que ce que j'ai écrit ne fait rien d'autrers que d'effacer totalement addressuseless ce qui n'est pas vraiment ce que je voulais obtenir .

  5. #45
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En traitant ta nouvelle requête dans les premières parties, le problème du premier caractère BOM devrait disparaitre... mais je n'ai plus le temps de regarder ce soir.
    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

  6. #46
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Ok, je vais essayer de voir comment faire cela ce matin.

  7. #47
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    La première partie de ton nouveau "module" (je parlerai plutôt de fonctionnalité) peut être réalisée dans la boucle où tu écris le fichier fichiergroup.txt : tu peux en profiter pour enregistrer les adresses découpées de $out3 dans %rule.
    Une manière de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
          if (defined $out3) {
            my @addresses = grep length, split /\s+/, $out3;
            print { $FICHIERGROUP } map "$_\n", @addresses;
            # add these group addresses to the known rules
            $rule{$_}++ foreach @addresses;
          }
    ...
    Ensuite, quand tu voudrais mettre à jour le fichier addressuseless.txt, en l'ouvrant en écriture, et en faisant des lectures dessus. Ceci n'est pas possible : si tu l'ouvres en écriture, il sera vidé, et tu ne pourras pas le lire. Tu dois :
    - soit ouvrir le fichier en lecture et écrire dans un nouveau fichier
    - soit l'ouvrir, le lire en entier dans une variable tableau, le fermer et le rouvrir en écriture

    Cela dit, tu gagnerais à exécuter la partie qui analyse le fichier addressgroup.txt juste après celle qui lit le fichier rule.txt (ainsi, tu remplirais %rule avec les addresses de rule.txt et celles de addressgroup), et ensuite faire le traitement du fichier address.txt, qui tiendra alors compte de toutes les règles enregistrées, sans avoir besoin de refaire le traitement.

    Ceci donne donc le script suivant :
    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
    68
    69
    70
    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 $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) {
            my @addresses = grep length, split /\s+/, $out3;
            print { $FICHIERGROUP } map "$_\n", @addresses;
            # add these group addresses to the known rules
            $rule{$_}++ foreach @addresses;
          }
          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;
     
    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";
      }
    }
    Je t'invite à vérifier que le code fait ce qui convient (testé sans plantage, mais pas vérifié fonctionnellement).
    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

  8. #48
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    J'ai modifié mon script en fonction de ce que tu as posté et cela fonctionne très bien !

    Merci beaucoup pour ton aide au cours de ces derniers jours, tu m'as vraiment bien débloqué dans toutes les situations problématiques.

    Du coup on peut mettre "résolu" sur le topic.

    Si j'ai d'autres envies de coder du perl, je referai une autre discussion, plus en rapport avec le theme.

    Encore merci pour tout !

  9. #49
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tu as aimé, n'hésite pas à
    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

  10. #50
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Juste un détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (defined(my $rule = <$RULE>))
    est strictement équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (my $rule = <$RULE>)
    C'est fait exprès pour éviter les bogues à la noix comme une ligne vide ou commençant par 0, qui seraient traités comme faux par Perl.

    Donc inutile de mettre le defined sur les lectures avec l'opérateur <> (spaceship), bien qu'il soit nécessaire si vous utilisez readline() ou autre à la place.

    --
    Jedaï

  11. #51
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    J'avais ajouté le defined justement pour corriger ce qui semblait être un bug ... Donc soit le bug était ailleurs, et je l'ai corrigé avec une autre modification, soit le fonctionnement est différent. Mais j'avoue utiliser rarement le while pour lire un fichier.

    Je vérifierai ça lundi (peut-être ... ).
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Comment exporter un fichier Excel vers CSV
    Par machipot dans le forum VBA Access
    Réponses: 0
    Dernier message: 09/06/2008, 22h09
  2. Réponses: 1
    Dernier message: 30/12/2007, 14h51
  3. Convertion fichier excel en CSV
    Par ceaser dans le forum Excel
    Réponses: 1
    Dernier message: 23/05/2007, 14h56
  4. Exporter fichier Excel en .csv
    Par pierre.coudert dans le forum Windows
    Réponses: 7
    Dernier message: 27/02/2007, 13h45
  5. conversion de fichier Excel en csv ,
    Par bounette dans le forum Excel
    Réponses: 2
    Dernier message: 26/01/2005, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo