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 POSIX Discussion :

Merge de deux fichiers csv [OS X] [SH]


Sujet :

Shell et commandes POSIX

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Merge de deux fichiers csv
    Bonjour à tous

    J'ai deux fichiers csv comme suit :

    1 aaa
    2 bbb
    3 ccc
    4 ddd
    5 eee
    6 fff
    7 ggg
    8 hhh
    9 iii
    10 jjj
    11 kkk

    et

    101 aaa
    102 bbb
    103 ccc
    104 ddd
    105 eee
    106 fff
    107 ggg
    108 hhh
    109 iii
    110 jjj
    111 kkk

    Mon objectif est de merger les deux sur un id commun (en l'occurence la deuxième colonne). Mon objectif final est bien sur un peu plus large car les deux fichiers cvs que je dois merger sont très importants en taille, que je devrai faire cette tâche régulièrement, et que le critère d'appariement sera composé de plusieurs colonnes. Mais un problème après l'autre. Je pourrais faire très simplement ceci avec =RECHERCHEV dans excel, mais pour toutes les raisons évoquées avant, cela ne me semble pas le bon choix.

    J'ai essayé le script ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    file1=/Users/xxx/Desktop/file1.csv
    file2=/Users/xxx/Desktop/file2.csv
     
    cut -d ";" -f 1,2 $file1 |while read line
    do
    echo $line | cut -d ";" -f 1
    grep $line $file2 | cut -d ";" -f 1
    done
    Mais cela me donne le résultat 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
     
    1
    101
    2
    102
    3
    103
    4
    104
    5
    105
    6
    106
    7
    107
    8
    108
    9
    109
    10
    110
    11
    111
    ce qui ne permet pas de le traiter comme un nouveau tableur. Je souhaite avoir le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    1;101
    2;102
    3;103
    4;104
    5;105
    6;106
    7;107
    8;108
    9;109
    10;110
    11;111
    J'imagine qu'il existe une solution assez simple à ce problème... Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Il y a des outils dédiés pour faire ce genre de chose.

    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
    $ cat merge1.txt
    1 aaa
    2 bbb
    3 ccc
    4 ddd
    5 eee
    6 fff
    7 ggg
    8 hhh
    9 iii
    10 jjj
    11 kkk
    $ cat merge2.txt
    101 aaa
    102 bbb
    103 ccc
    104 ddd
    105 eee
    106 fff
    107 ggg
    108 hhh
    109 iii
    110 jjj
    111 kkk
    D'abord, la jointure avec join.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ join merge1.txt merge2.txt -j2
    aaa 1 101
    bbb 2 102
    ccc 3 103
    ddd 4 104
    eee 5 105
    fff 6 106
    ggg 7 107
    hhh 8 108
    iii 9 109
    jjj 10 110
    kkk 11 111
    Bon outil, mais que je connais assez mal. Pour plus d'infos, man join puis lire.

    Il y a le classique awk ou gawk qui permet de modifier des fichiers texte en considérant les champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ awk '(NR==FNR){a[$2]=$1;next;} {b[$2]=$1;} END{for (i in a) print b[i]";"a[i];}' merge1.txt merge2.txt 
    108;8
    110;10
    101;1
    103;3
    105;5
    107;7
    109;9
    111;11
    102;2
    104;4
    106;6
    Peut-être plus malléable à loisir.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci, la commande awk fonctionne parfaitement

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

Discussions similaires

  1. Comparer deux fichiers csv
    Par kerplouz dans le forum Général Python
    Réponses: 1
    Dernier message: 21/11/2012, 21h17
  2. [Numpy/SciPy]Correlation de données depuis deux fichiers csv
    Par progfou dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 13/03/2012, 12h34
  3. Joindre deux fichiers csv
    Par charliplanete dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 29/07/2011, 11h41
  4. Réponses: 1
    Dernier message: 13/07/2011, 18h22

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