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 :

Lire un fichier de données ayant une structure en "paragraphes"


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Par défaut Lire un fichier de données ayant une structure en "paragraphes"
    Bonjour!

    J'ai assez de notions en commande linux pour me débrouiller d'habitude (étant principalement en dev web front end), avec des usages basiques de GREP et AWK, mais là je flanche. Je n'ai jamais traité de fichier de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Nom;John;Wilson
    Adresse;New-York;Usa;AmeriqueNord
    Nom;Jean;Martin;
    Adresse;Paris;France;Europe
    Nom;Katie;Wilson
    Adresse;Chicago;Usa;AmeriqueNord
    (Je ne sais même pas comment appeler une telle structure de données)

    Et la sortie doit ressembler à ça (la fusion des WILSON n'est pas obligatoire, je ferai un post-traitement côté javascript si trop compliqué en bash):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Wilson;Usa
    Martin;France
    Soit le nom de famille + le pays sur la même ligne.
    Surement faisable avec awk ou autre, mais je n'ai aucune idée de comment l'exploiter et je m'en remets donc à vous

    Donc si vous avez une idée ou une piste, merci par avance!

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    dans l'absolu ça n'est pas très compliqué, mais y a-t-il des cas particuliers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nom Pierre Alexandre DUGENOU
    Adresse La Baule FRANCE
    Nom Aurelien DA MOTTA
    Adresse Seoul SOUTH COREA
    sinon en admettant que le nom et le pays sont le dernier mot de chaque ligne, via awk quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/^Nom/ {line = $NF; lock=1; next} lock == 1 {line = line " " $NF; print line; lock=0}' fichier
    le premier bloc d'instructions s'exécute sur la condition d'un match regex /^Nom/, le second sur la condition lock == 1
    note qu'on aurait aussi bien pu se passer du lock ou jouer simplement sur le numéro de la ligne pour faire plus court

    Edit: au temps pour moi j'ai zappé la fusion des nom-pays :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/^Nom/ {line=$NF; lock=1; next} lock == 1 {tab[line "_" $NF]=line " " $NF; lock=0} END {for (i in tab) {print tab[i]}}' fichier
    le principe reste le même, simplement on stocke chaque résultat indexé dans un tableau associatif, qui du coup garantit l'unicité des enregistrements

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed '1~2N;s/\n/ /;s/[^ ]*[^A-Z ][^ ]* //g' test.txt | sort -u
    MARTIN FRANCE
    WILSON USA
    $ sed '1~2N;s/\n/ /;s/[^ ]*[^A-Z ][^ ]* //g' test2.txt | sort -u
    DA MOTTA SOUTH COREA
    DUGENOU FRANCE
    Personnellement, je trouve que, si on prend le temps de traiter ce fichier, il est bon de le mettre dans un format correct. Donc pas celui-là. Comme par exemple avec un point-virgule entre les champs pour pouvoir retraiter avec awk.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    joli

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed 'N;s/.* //gM;s/\n/ /' fichier.txt 
    WILSON USA
    MARTIN FRANCE
    WILSON USA

  6. #6
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Par défaut
    Merci pour vos messages! Je vais les décortiquer un peu et je vous tiendrai au courant

    Citation Envoyé par BufferBob Voir le message
    mais y a-t-il des cas particuliers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nom Pierre Alexandre DUGENOU
    Adresse La Baule FRANCE
    Nom Aurelien DA MOTTA
    Adresse Seoul SOUTH COREA
    Pas de cas particuliers un champ = un texte sans espace

    Citation Envoyé par BufferBob Voir le message
    sinon en admettant que le nom et le pays sont le dernier mot de chaque ligne, via awk quelque chose du style
    Je vais éditer mon exemple, ce n'est pas forcément le dernier mot Les majuscules n'ont plus ne sont pas à prendre en compte d'ailleurs

    Citation Envoyé par Flodelarab Voir le message
    Personnellement, je trouve que, si on prend le temps de traiter ce fichier, il est bon de le mettre dans un format correct. Donc pas celui-là. Comme par exemple avec un point-virgule entre les champs pour pouvoir retraiter avec awk.
    On est d'accord! Malheureusement on me fournit ce fichier et je dois le traiter tel quel
    Par ailleurs, il est possible d'ajouter des points-virgules en effet, si ça peut être plus simple. J'édite mon exemple

    En tout cas je pense qu'à un moment donné on doit passer par les noms de champ (Adresse, Nom,...). Car il est possible qu'un champ Telephone se glisse dans certains

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

Discussions similaires

  1. Extraire les infos d'un tag ID3
    Par patkiller dans le forum Langages de programmation
    Réponses: 12
    Dernier message: 22/02/2025, 00h24
  2. Lire un fichier, extraire les infos
    Par JokerAs dans le forum C
    Réponses: 15
    Dernier message: 26/09/2014, 21h58
  3. Récupérer les infos de version d'un fichier
    Par Eldann dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/07/2009, 15h50
  4. Réponses: 3
    Dernier message: 15/05/2008, 16h06
  5. [VBA-E]Extraire les infos des cellules
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/04/2006, 09h46

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