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

Shell et commandes GNU Discussion :

Suppression des doublons dans chaque ligne d'un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut Suppression des doublons dans chaque ligne d'un fichier
    Bonjour à tous;

    la simplicité du titre cache la sophistication de ce que je veux parvenir à faire, mais je pouvais pas tout mettre dans le titre, ça rentrait pas
    Mais en gros cette approche est un bon point de départ.


    Alors .... Soit un fichier contenant des dizaines de lignes dont voici quelques lignes en exemple: un fichier datas.txt.bak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange" pepins="avec" categorie="fruit" article="courgette" pepins="sans" categorie="legume" 
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    et j'ai planché toute la nuit sans succès, pour obtenir ce type de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange:[courgette]" pepins="avec:[sans]" categorie="fruit:[legume]" 
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"
    Évidemment que dans le cadre d'une fonction, j'aurais pu m'en sortir en traitant ligne par ligne, mais j'ai fait chauffer les neurones pour trouver la ligne de code pure et élégante, en
    vain. Je soupçonne Awk d'être la commande de la situation, mais c'est pas assez mon pote pour le convoquer, j'ai préféré me tourner vers Sed.
    Vu la sortie attendue, j'ai besoin de l'aide d'un surdoué du scripting, à mon avis. Il est aussi envisageable que ce soit impossible à faire, sauf à pondre une fonction.

    j'étais parti sur un truc du style (c'est pas ça qui m'a pris toute la nuit j'ai beaucoup lu aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat datas.txt.bak > datas.txt; while read line; do newline="$(echo "$line"|tr ' ' '\n'|sort -u|tr '\n' ' ')"; sed -i 's%'"$line"'%'"$newline"'%g' datas.txt;done< <(sed '/jour/p' datas.txt)
    qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    article="banane" categorie="fruit" jour="3" pepins="sans" 
    article="courgette" article="orange" categorie="fruit" categorie="legume" jour="6" pepins="avec" pepins="sans"  
    article="orange" article="pomme" categorie="fruit" jour="5" pepins="avec"
    Mettons que article, categorie, jour, pepins, soient les noms de colonnes.
    On voit bien que les valeurs identiques sont réduites à une occurrence (ex ligne 3 +> categorie="fruit" voit son doublon supprimé)
    Évidement je n'ai pas fusionné les valeurs différentes pour une colonne de même nom comme dans la sortie souhaité.
    Mais j'ai une autre contrainte aussi, je veux que l'ordre des colonnes soit respecté tel que présenté dans le fichier source, c'est à dire
    jour - article - pepins - categorie (ordre préservé).

    Pensez vous que c'est faisable ? En fait je pense qu'il y a moyen de manipuler les colonnes tel que je veux mais je n'ai pas les connaissances

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Bonjour,

    tu préférerais pas qu'on discute du format de ce fichier ?
    celui-ci est bien moisi : maintenant pour le convertir, plus tard pour l'exploiter...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    Bonjour N_Bah
    Citation Envoyé par N_BaH Voir le message
    tu préférerais pas qu'on discute du format de ce fichier ?
    Inutile je t'assure. Évidemment que j'ai pris des exemples de nom de colonne moisis à l'arrache, mais ne pas s'attacher au sens du pourquoi du comment j'obtiens un tel fichier.
    C'est fondé, optimisé, c'est juste qu'avec des jour des articles des catégories et des pépins ça le fait pas mais moi je sais pourquoi
    Tu aurais une idée, je me demande s'il n'y a pas un truc à faire avec join mais je suis un peu perdu par contre là, jamais employé join

  4. #4
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Bonjour,

    sans préjuger des capacités de bash,
    voilà de quoi ne pas vous laisser en carafe,
    et vous évitez d'autres nuits banche.

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?php 
    $k=<<<EOD
    jour="3" article="banane" pepins="sans" categorie="fruit" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange" pepins="avec" categorie="fruit" article="courgette" pepins="sans" categorie="legume" 
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    EOD;
     
    $lines = explode("\n", $k);
    foreach($lines as $l) {
        $n=[];
        $key="";
        $value="";
        $in_quote=false;
        $in_escape=false;
        $in_key=true;
        foreach(str_split($l) as $c) {
            if(!$in_quote && $c=='"') {
                $in_quote=true;
                continue;
            }
            if($in_quote && $c=='\\') {
                $in_escape=true;
                continue;
            }
            if($in_quote && $c=='"') {
                if ($in_escape) {
                    $in_escape=false;
                }else{
                    $in_quote=false;
                    continue;
                }
            }
     
            if(!$in_quote && $c==" ") {
                if($key!=""){
                    $n[] = ["name"=>$key,"value"=>$value];
                }
                $key="";
                $value="";
                $in_key=true;
                continue;
            }
            if($in_key && $c=="=") {
                $in_key=false;
                continue;
            }
            if($in_key) {
                $key="$key$c";
            }else{
                $value="$value$c";
            }
        }
        if($key!=""){
            $n[] = ["name"=>$key,"value"=>$value];
        }
     
        $d=[];
        $keys=[];
        $jour="";
        $article="";
        foreach($n as $v){
            if($v["name"]=="jour") {
                $jour=$v["value"];
                continue;
            }
            if($v["name"]=="article") {
                $article=$v["value"];
            }
            $keys[]=$v["name"];
     
            $d[$article][$v["name"]] = $v["value"];
        }
     
        $keys = array_unique($keys);
     
        $res=" jour=".'"'.addslashes($jour).'"';
        foreach($keys as $key) {
            $res.=" $key=";
            $n=0;
            $prev="";
            $val="";
            foreach($d as $v){
                if ($n==0) {
                    $val.= $v[$key];
                }else if($prev!=$v[$key]){
                    $val.=":[".$v[$key]."]";
                }
                $prev=$v[$key];
                $n++;
            }
            $res.='"'.addslashes($val).'"';
        }
        $res=trim($res);
        echo($res."\n");
    }
    produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour="3" article="banane" pepins="sans" categorie="fruit"
    jour="6" article="orange:[courgette]" pepins="avec:[sans]" categorie="fruit:[legume]"
    jour="5" article="pomme:[orange]" pepins="avec" categorie="fruit"
    Bonne journée.

  5. #5
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    Oui .... merci beaucoup. Voici plantées les bases pour une belle solution de repli, lorsque j'aurai rendu les armes ....
    Malheureusement la gestion des tableaux Bash est quelque peu "triviale", mais il y a moyen. Tiens je vais tenter de rentrer les lignes dans un tableau associatif pour voir si ça me donne pas un pavé de code.
    Mais franchement je pense qu'Awk est l'homme de la situation, pour qui sait l'utiliser

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    tu devrais remplacer
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    jour="5" article="pomme" pepins="avec" categorie="fruit" article="orange" pepins="avec" categorie="fruit"
    par
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    jour="5" article="pomme de terre" pepins="sans" categorie="légume" article="orange" pepins="avec" categorie="fruit"

    quand je pense qu'il y a des gens qui ont normalisé des formats de fichiers de données (CSV, XML, JSON) pour faciliter leur accès...
    mais bon, l'important c'est que ce soit optimisé, et que tu saches pour( )quoi.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression des doublons dans une variable de type tableau
    Par damsmut dans le forum Général VBA
    Réponses: 2
    Dernier message: 23/07/2019, 10h36
  2. [XL-2003] suppression des doublons dans une Combobox
    Par karim19 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/10/2009, 16h42
  3. [Tableaux] suppression des doublons dans un tableau
    Par hammag dans le forum Langage
    Réponses: 3
    Dernier message: 17/06/2009, 19h13
  4. problème avec la suppression des doublons dans arraylsit
    Par ulysse031 dans le forum Langage
    Réponses: 13
    Dernier message: 04/03/2007, 12h52
  5. Réponses: 13
    Dernier message: 20/11/2006, 17h46

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