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 :

Recherche et découpage de fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut Recherche et découpage de fichier
    Bonjour,

    Je fais appel à la communauté pour une demande urgente. Enfin urgente pour mon patron...

    Mon problème est le suivant:
    j'ai un fichier plat (type csv). voir pièce jointe
    On va faire simple: ce fichier possède des lignes qui comporte un nom, un mail, et un numéro de commandes.

    L'idée est de découper ce fichier en n fichiers.
    On doit dispatcher toutes ces lignes dans n fichiers tant qu'on respecte la condition suivante : on ne retrouve jamais une ligne de commande avec une même adresse mail dans un des fichiers

    Exemple (car vous ne devez rien comprendre):

    dans mon fichier initial

    Dupond|dupond@gmail.com|0001
    Martin|martin@gmail.com|0002
    Pierre|pierre@gmail.com|0003
    Dupond|dupond@gmail.com|0004
    Dupond|dupond@gmail.com|0005
    Olivier|olivier@gmail.com|0006
    Pierre|pierre@gmail.com|0007


    il faut transformer ce fichier en 3 fichiers
    fichier 1 :
    Dupond|dupond@gmail.com|0001
    Martin|martin@gmail.com|0002
    Pierre|pierre@gmail.com|0003
    Olivier|olivier@gmail.com|0006

    fichier 2
    Dupond|dupond@gmail.com|0004
    Pierre|pierre@gmail.com|0007

    fichier 3
    Dupond|dupond@gmail.com|0005


    Voilà le casse-tête. Bien sur je n'ai aucune idée du comment. Alors j'ose carrément faire une demande directe. Qui peux me faire un petit script pour y arriver (ou une grosse base de solution).

    C'est un cas désespéré, je ne le ferais pas en temps normal. Mais là, je vous crie "A l'aide !!!! faites moi le petit programme qui m'aidera a obtenir une augmentation !! "

    Bon si vous m'envoyez bouler, je ne vous en voudrait pas, mais si une âme charitable veux bien m'aider, je lui en serais très reconnaissant !!

    Merci
    Fichiers attachés Fichiers attachés

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

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

    en gros, en awk, ou avec un shell qui admet les tableaux associatifs
    tu crées un tableau pour chaque @mail, qui
    prend l'@mail comme indice, et dont
    la valeur sera incrémentée si on rencontre l'@mail
    la ligne est alors redirigée vers fichier_(tableau[@mail]).

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par faulk Voir le message
    Bonjour,

    Je fais appel à la communauté pour une demande urgente. Enfin urgente pour mon patron...

    Mon problème est le suivant:
    j'ai un fichier plat (type csv). voir pièce jointe
    On va faire simple: ce fichier possède des lignes qui comporte un nom, un mail, et un numéro de commandes.

    L'idée est de découper ce fichier en n fichiers.
    On doit dispatcher toutes ces lignes dans n fichiers tant qu'on respecte la condition suivante : on ne retrouve jamais une ligne de commande avec une même adresse mail dans un des fichiers

    Exemple (car vous ne devez rien comprendre):

    dans mon fichier initial

    Dupond|dupond@gmail.com|0001
    Martin|martin@gmail.com|0002
    Pierre|pierre@gmail.com|0003
    Dupond|dupond@gmail.com|0004
    Dupond|dupond@gmail.com|0005
    Olivier|olivier@gmail.com|0006
    Pierre|pierre@gmail.com|0007


    il faut transformer ce fichier en 3 fichiers
    fichier 1 :
    Dupond|dupond@gmail.com|0001
    Martin|martin@gmail.com|0002
    Pierre|pierre@gmail.com|0003
    Olivier|olivier@gmail.com|0006

    fichier 2
    Dupond|dupond@gmail.com|0004
    Pierre|pierre@gmail.com|0007

    fichier 3
    Dupond|dupond@gmail.com|0005


    Voilà le casse-tête. Bien sur je n'ai aucune idée du comment. Alors j'ose carrément faire une demande directe. Qui peux me faire un petit script pour y arriver (ou une grosse base de solution).
    Salut
    Généralement ce n'est pas le but de ce forum que de donner des solutions toutes faites à laquelle le posteur ne panne que dalle mais est tout content de pouvoir briller avec le travail des autres (surtout que généralement il ne brille pas longtemps).
    Mais comme tu as eu l'honnêteté de tout déballer sans essayer de te cacher et qu'en plus j'aime bien venir narguer N_Bah quand il dit qu'il faut un shell spécial alors qu'on peut très bien le faire avec le vrai shell de nos ancêtres...

    Citation Envoyé par faulk Voir le message
    C'est un cas désespéré, je ne le ferais pas en temps normal. Mais là, je vous crie "A l'aide !!!! faites moi le petit programme qui m'aidera a obtenir une augmentation !! "
    Ah ? Et tu redistribues qqchose ???

    Citation Envoyé par faulk Voir le message
    Bon si vous m'envoyez bouler, je ne vous en voudrait pas, mais si une âme charitable veux bien m'aider, je lui en serais très reconnaissant !!
    Comme le disait Earl Dumarest dans les romans "L'aventurier des étoiles", un merci n'est qu'un mot qui ne coûte pas grand chose. Menfin...

    Code bash : 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
    #!/bin/sh
     
    # Fonction qui renvoie le premier fichier n'ayant pas le mail ciblé
    find_file()
    {
    	# Récupération mail
    	mail=$1; shift
     
    	# Traitement des fichiers
    	for file in $*
    	do
    		# Recherche mail dans fichier courant
    		cut -f2 -d\; "$file" |grep "^$mail$" 1>/dev/null && continue
     
    		# Mail non trouvé - Renvoi nom fichier
    		echo "$file"
    		return 0
    	done
     
    	# Ensemble des fichiers traités - Aucun ne convient
    	return 1
    }
     
    # Initialisation
    i=0
    liste=""
     
    # Traitement fichier
    cat commandes.txt |while read ligne
    do
    	# Extraction mail
    	mail=`echo $ligne |cut -f2 -d\;`
     
    	# Recherche fichier dispo pour mail
    	file=`find_file "$mail" "$liste"`
     
    	# Si fichier non trouvé
    	if test -z "$file"
    	then
    		# Indice
    		i=`expr $i + 1`
     
    		# Nouveau fichier
    		file="fichier_$i"
    		liste="$liste $file"
    	fi
     
    	# Ecriture ligne dans fichier récupéré ou créé
    	echo "$ligne" >>"$file"
    done

    Résultat sur ton fichier donné en téléchargement qui, contrairement à tes exemples, est séparé sur le caractère ";" et non "|" (c'est quand-même pas compliqué de donner des exemples au-moins équivalents à la réalité quoi !!!)

    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
    moi@debian:~/aaa$ ll
    total 12
    -rw-r--r-- 1 moi users  227 13 oct.  19:33 commandes.txt
    -rwxr-xr-x 1 moi users  892 13 oct.  20:05 trt.sh
     
    moi@debian:~/aaa$ ./trt.sh 
     
    moi@debian:~/aaa$ ll
    total 24
    -rw-r--r-- 1 moi users  227 13 oct.  19:33 commandes.txt
    -rw-r--r-- 1 moi users  139 13 oct.  20:09 fichier_1
    -rw-r--r-- 1 moi users   58 13 oct.  20:09 fichier_2
    -rw-r--r-- 1 moi users   30 13 oct.  20:09 fichier_3
    -rwxr-xr-x 1 moi users  892 13 oct.  20:05 trt.sh
     
    fichier_1
    client;mail;commande (oui, désolé, j avais pas envie de me casser le noeud à virer cette ligne d en-tête car faut quand-même pas pousser)
    Dupond;dupond@gmail.com;0001
    Martin;martin@gmail.com;0002
    Pierre;pierre@gmail.com;0003
    Olivier;olivier@gmail.com;0006
     
    fichier_2
    Dupond;dupond@gmail.com;0004
    Pierre;pierre@gmail.com;0007
     
    fichier_3
    Dupond ;dupond@gmail.com;0005
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [batch] Recherche et découpage de fichier
    Par faulk dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 18/10/2012, 18h30
  2. Réponses: 3
    Dernier message: 11/06/2009, 18h49
  3. [FPDF] Recherche chaine caractères dans fichier pdf
    Par licorne dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/10/2005, 12h55
  4. Recherche sur tous les fichiers d'un projet
    Par Kaorichan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/04/2005, 12h28
  5. Réponses: 16
    Dernier message: 25/11/2004, 13h34

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