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 :

lecture d'un fichier et suppression de doublons sur quelques champs


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut lecture d'un fichier et suppression de doublons sur quelques champs
    Bonjour

    Je lis un fichier plat séparé par ; . J'en extrais des colonnes qui m'interessent. supposons que j'extrais 5 colonnes et que je ne veux pas de doublons sur ces 5 colonnes. Ma régle c'est que j'ai deux indices A et B c'est toujours l'indice A qui fait foi si ces 5 colonnes sont identiques pour A et B je delete tout ce qui vient de B. Ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A	B		
    1A	1A      EUR  SIG  MAR
    1A	1A_TX  EUR  SIG  MAR
    Là je veux deleter la ligne où il ya 1A_TX . Par contre si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A	B		
    1B	1B        EUR  SIG  MAR
    1A	1A_TX   EUR  SIG  MAR
    je veux garder la ligne 1A_TX.
    Moi je pensais faire un test du style est ce que le champ sur le quel je suis se termine par X .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($tabDataSA[$GOP_INDICE]!=~"*X")
    Sauf que ça ne fait pas du tout ce que je veux.
    Qui peut me donner des indications .
    Merci

  2. #2
    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
    Citation Envoyé par k6971
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($tabDataSA[$GOP_INDICE]!=~"*X")
    Sauf que ça ne fait pas du tout ce que je veux.
    Qui peut me donner des indications .
    Merci
    Quoi qu'il en soit du reste, cette ligne est fausse, d'une part bien que cela puisse fonctionner, utiliser une chaîne de caractère comme regex est rarement une bonne idée, d'autre part cette regex est syntaxiquement incorrecte.
    Une ligne correcte serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( $tabDataSA[$GOP_INDICE] !~ m/.*X$/ )
    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    Jedai je comprend sje ne suis qu'un tout novice sur perl. Si tu peux me donner des indic je suis preneur sur comment éviter mes doublons.

  4. #4
    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
    Tu peux effectuer une recherche sur le forum, tu trouveras pas mal de sujet sur la suppression de doublons.
    Cependant ton énoncé me laisse songeur : en effet un coup tu dis que tu as doublon quand les 5 colonnes sont identiques entre deux enregistrements, mais ensuite tu sembles dire que l'une des colonne est différente et que c'est ça qui te permet de décider laquelle supprimer (mais si les enregistrements sont vraiment des doublons peu importe lequel tu supprimes, n'est-ce pas ?)...

    Donne quelques exemples réels (légèrement remaniés si les données sont confidentielles), que l'on voit quel est exactement ton problème.

    --
    Jedaï

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    données confientielles

  6. #6
    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
    Ok, dans ce cas pour savoir s'il faut supprimer une ligne (ou de préférence l'éliminer avant de l'enregistrer), il suffit de vérifier si la 4ème colonne est égale à la 3ème plus "_TX" ?
    Dans ce cas en supposant que les colonnes sont dans @cols :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    next if $cols[3] eq $cols[2].'_TX';
    --
    Jedaï

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    C'est en partie ça sauf que si cols[3] eq cols[2] et que cols[3] par ex vaut HQ_X et qu'il n y a pas HQ sans le X dans la cols[3] je veux quand même garder cette ligne.

  8. #8
    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
    Citation Envoyé par k6971
    C'est en partie ça sauf que si cols[3] eq cols[2] et que cols[3] par ex vaut HQ_X et qu'il n y a pas HQ sans le X dans la cols[3] je veux quand même garder cette ligne.
    Oui, bien sûr.......................... J'ai rien compris (ou si j'ai bien compris mon code fait déjà ça, mais je crois que j'ai rien compris).

    --
    Jedaï

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    Je crois que j'ai une solution tu me diras si c'est bon je l'ai testé et apparemment j'ai tout ce qu'il faut les fichiers sont volumineux mais je continue le test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((!($tabDataSA[$CO_INDICE] !~ m/.*X$/)) || (($tabDataSA[$CO_INDICE] !~ m/.*X$/)&& ($tabDataSA[$CO_INDICE] eq $tabDataSA[$GOP_INDICE]))){
    J'explique si la colonne A se termine par _X je le print ou si la colone A ne se termine pas par X et qu'elle n'est pas égale à la colonne B. je le print aussi

  10. #10
    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
    Citation Envoyé par k6971
    Je crois que j'ai une solution tu me diras si c'est bon je l'ai testé et apparemment j'ai tout ce qu'il faut les fichiers sont volumineux mais je continue le test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((!($tabDataSA[$CO_INDICE] !~ m/.*X$/)) || (($tabDataSA[$CO_INDICE] !~ m/.*X$/)&& ($tabDataSA[$CO_INDICE] eq $tabDataSA[$GOP_INDICE]))){
    J'explique si la colonne A se termine par _X je le print ou si la colone A ne se termine pas par X et qu'elle n'est pas égale à la colonne B. je le print aussi
    Je ne saurais dire si le code fait ce que tu veux (vu que je n'ai pas compris), mais je peux au moins améliorer légèrement l'aspect et la lisibilité de la "chose" (on n'est pas en Lisp !! ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if( $tabDataSA[$CO_INDICE] =~ m/.*X$/ or 
        ($tabDataSA[$CO_INDICE] !~ m/.*X$/ and $tabDataSA[$CO_INDICE] ne $tabDataSA[$GOP_INDICE])
      ) {
    EDIT : Il y avait une petite erreur dans ton code ('eq' au lieu de 'ne', maintenant ma correction fait au moins ce que tu DIS dans ton dernier message... Est-ce que c'est ce que tu désires ou non... C'est un autre problème !

    --
    Jedaï

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    dnnées confientielles

  12. #12
    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
    Ok, je crois que j'ai compris ce que tu voulais dire...
    Tu veux que soit supprimées les lignes pour lesquelles GOP s'écrit x_TX si x est la valeur de GOP2 dans n'importe quelle ligne, j'ai bon ?

    Dans ce cas :
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    my $srcfile = 'chemin de ton fichier';
     
    open my($src), '<', $srcfile
      or die "Can't read $srcfile : $! \n";
     
    my %GOP2;
    # @lines = ( [ 'STRUCT', 'ENT', ... "\n" ], [ 'D', 'SG', 'HO_TX', ... ], [ 'D'...], ... )
    my @lines = map { m/^\s*$/ ? () : [split /\t/]  } <$src>;
    # met dans %GOP2 les différentes valeurs de GOP2 (en tant que clé)
    $GOP2{$_->[2]} = 1 for @lines;
     
    my @out;
     
    for my $line (@lines){
      # si le GOP de cette ligne se termine par _TX, mettre ce qu'il y a avant dans $test
      if( (my $test = $line->[3]) =~ s/_TX$// ) {
        # sauf si $test est une des valeurs de GOP2, mettre la ligne dans @out
        push @out, (join "\t", @$line) unless exists $GOP2{$test};
      } else { # sinon
        # mettre la ligne dans @out
        push @out, (join "\t", @$line);
      }
    }
     
    print @out;
     
    __END__
    N'hésite pas à poser des questions.

    --
    Jedaï

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    Mais il ya un petit souci c'est que je pars d'un premier fichier et j'extrais les colones que je veux et qu'aussi c'est que les colonnes du premier fichier peuvent changer de position d'une version à une autre. Donc ce que j'avais fait c'était de mapper les indices vues que les noms des colonnes eux ne changenet jamais . 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    while (<FILE_SA_BRUTE_CONSO>) {
     
    	@tabDataSA = split(";",$_);
    	$scalarTabDatSA=scalar(@tabDataSA);
     
    	for ($i=0;$i<=$scalarTabDatSA;$i++)
    	{
     			$SAIndiceValue=$tabDataSA[$i];
     
      			if($SAIndiceValue eq $METIER || $SAIndiceValue eq $ACTIVITE || $SAIndiceValue eq $SA1 || $SAIndiceValue eq $SA2 || $SAIndiceValue eq $CO)
      			{
      				if($SAIndiceValue eq $METIER ){ 					
      					$METIER_INDICE=$i;
      					$METIER_VALEUR=$SAIndiceValue;  										
      				}
      				if($SAIndiceValue eq  $ACTIVITE ){ 					
      					$ACTIVITE_INDICE=$i;
      					$ACTIVITE_VALEUR=$SAIndiceValue;  									
      				}
      				if($SAIndiceValue eq $SA1 ){ 					
      					$SA1_INDICE=$i; 
      					$SA1_VALEUR=$SAIndiceValue;  										
      				}
      				if($SAIndiceValue eq $SA2 ){ 					
      					$SA2_INDICE=$i; 
      					$SA2_VALEUR=$SAIndiceValue; 					
      				}
      				if($SAIndiceValue eq $CO ){ 					
      					$CO_INDICE=$i;
      					$CO_VALEUR=$SAIndiceValue;   					
      				} 
      			} 			
    	}
    	if($CO_INDICE != "" && $SA2_INDICE != "" && $SA1_INDICE && $ACTIVITE_INDICE != "" && $METIER_INDICE != ""){
    		print FILE_SA_EXTRAITE $tabDataSA[$CO_INDICE],";",$tabDataSA[$SA2_INDICE],";",$tabDataSA[$SA1_INDICE],";",$tabDataSA[$ACTIVITE_INDICE],";",$tabDataSA[$METIER_INDICE],"\n";  				
    	}
    }
    J'ai testé ton code mais j'arrive pas à afficher les champs à chauqe fois celà me marque arrray(quelque chose)..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for my $SA_LINE (@lines){
    	#@SplitedLine = split(";",$SA_LINE);
    	@SplitedLine = split("",$SA_LINE);
    	$scalarTabLineSA=scalar(@SplitedLine);
    	#print "la taille de scalarTabLineSA est de ",$scalarTabLineSA,"\n";
    	for ($i=0;$i<=$scalarTabLineSA;$i++)
    	{
     		print "les éléments de  scalarTabLineSA sont ",$SplitedLine[$i],"\n";
    	}
    ça ne m'affiche rien.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut afficher les éléments d'un tableau qui utlise la fonction map
    Bonsoir
    J'ai un tableau qui utilise la fonction map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     @LINES = map { m/^\s*$/ ? () : [split /\;/]  } <$FILE_SA_BRUTE_CONSO>;
    je récupére les résultats de la maniére suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    f( (my $test = $SA_LINE->[$GOP_INDICE]) =~ s/_TX$// ) {
        # sauf si $test est une des valeurs de GOP2, mettre la ligne dans @SA_LINE_OUT_TAB
        push @SA_LINE_OUT_TAB, (join "\;", $SA_LINE) unless exists $GOP2{$test};  	
      } else { # sinon
        # mettre la ligne dans @SA_LINE_OUT_TAB
        push @SA_LINE_OUT_TAB, (join "\;", $SA_LINE);   
      }
    mais quand j'essaie d'afficher les valeurs récupérés j'ai juste ça
    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
     
    C:\USERS\ndiayeben\Programs\workspace\StructureAnalytique>structureanalytique.pl
    CoucouENT
    les ÚlÚments de  SA_LINE_OUT_TABsont ARRAY(0x182fa50)
    les ÚlÚments de  SA_LINE_OUT_TABsont
    les ÚlÚments de  SA_LINE_OUT_TABsont ARRAY(0x1843838)
    les ÚlÚments de  SA_LINE_OUT_TABsont
    les ÚlÚments de  SA_LINE_OUT_TABsont ARRAY(0x1843a60)
    les ÚlÚments de  SA_LINE_OUT_TABsont
    les ÚlÚments de  SA_LINE_OUT_TABsont ARRAY(0x1843c88)
    les ÚlÚments de  SA_LINE_OUT_TABsont
    les ÚlÚments de  SA_LINE_OUT_TABsont ARRAY(0x1843eb0)
    les ÚlÚments de  SA_LINE_OUT_TABsont
    les ÚlÚments de  SA_LINE_OUT_TABsont ARRAY(0x18440d8)
    les ÚlÚments de  SA_LINE_OUT_TABsont
    qui peut m'aoider merci

  15. #15
    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
    Regarde plus attentivement mon code (soit dit en passant, tu aurais dû rester dans le même post, je vais fusionner les discussions), il te manque un @ devant $SA_LINE dans les join().

    (Par ailleurs, les noms de variables tout en majuscules c'est laid et c'est plutôt réservé aux constantes... Enfin je suppose que les goûts et les couleurs ne se discutent pas)

    --
    Jedaï

  16. #16
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 54
    Points : 34
    Points
    34
    Par défaut
    Oui je suis désolé . Je t'explique donc ma pocédure. Je fais une rpremiére passe et j'extrais les indices des colonnes ce qui me permet de mapper dynamiquement les colonnes même si ele changent de position et aprés j'implemente ton code.

Discussions similaires

  1. [XL-2013] Fichier Email, suppression des doublons
    Par nicklaren dans le forum Excel
    Réponses: 2
    Dernier message: 25/08/2014, 15h32
  2. Suppression des doublons sur un fichier en fonction de plusieurs champs
    Par moctarim dans le forum Shell et commandes POSIX
    Réponses: 7
    Dernier message: 27/12/2012, 11h06
  3. Suppression de doublons sur une grosse table
    Par CaptainT dans le forum SQL
    Réponses: 20
    Dernier message: 24/05/2008, 09h25
  4. [SQL] Suppression des doublons d'un champs SQL
    Par fabien14 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/05/2007, 14h28
  5. Suppression de doublons sur plusieurs champs
    Par riperoutz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2007, 14h23

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