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 :

Problème de "champ" absent parfois


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut Problème de "champ" absent parfois
    Coucou,

    C'est encore moi
    [note de la modération]
    suite de la discussion : [bash]Traitement d'un fichier txt/html
    [/note]

    Bon j'ai réussi tout ce qui me posait pb mais j'ai un nouveau problème très différent..

    en gros j'ai un txt qui ressemble a ça :
    blabla
    TITRE1
    blabla
    GENRE1
    blabla
    NOTE1
    blabla
    BANDEANNONCE1
    blabla
    TITRE2
    blabla
    GENRE2
    blabla
    NOTE2
    blabla
    BANDEANNONCE2
    blabla
    TITRE3
    blabla
    GENRE3
    blabla
    BANDEANNONCE3
    blabla
    TITRE4
    blabla
    GENRE4
    blabla
    NOTE4
    blabla


    Et je veux recupérer dans un fichier :
    TITRE1
    GENRE1
    NOTE1
    BA1
    TITRE2
    ect

    Sauf que comme certains films n'ont pas de notes, d'autre pas de bande annonce, ou encore ni l'un ni l'autre j'ai un probleme de correspondance.

    J'ai essayé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    for (( i=0; i<=100; i++));
    do
    	egrep -m 1 \<meta\ property\=\"og\:title\" | cut -d\" -f4 | sed -re "s/'/\'/g" >> AZER.txt #les titres
    	egrep -m 1 ratingValue | sed 's/^[ \t]*//;s/[ \t]*$//' | cut -d\" -f4 >> AZER.txt #les notes
    	egrep -m 1 allowfull | cut -d\/ -f3-6 | cut -d\" -f1 >> AZER.txt #les bandes annonce
    	egrep -m 1 td\ data-heading\=\"Genre\" | cut -d\< -f3 | cut -d\> -f2 | sed -re "s/'/\'/g" >> AZER.txt # les genres
     
    done < Prem*.txt
    Mais des qu'un film ne possède pas de note ou de BA ça décale tout et je n'arrive pas à regler le pb (en gros si y'a pas de notes on continue, pareil pour les ba)

    En faisant tourner le code avec juste les titres et les genres (comme chaque film à un titre et un genre) ça marche et rend ç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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Le Retour de Mary Poppins
    Film fantastique
    Aquaman
    Film fantastique
    L'Empereur de Paris
    Drame
    Le Gendre de ma vie
    Comédie
    Wildlife : une saison ardente
    Drame
    Masha et Michka : les nouvelles aventures
    Autre
    The Bookshop
    Drame
    Maya
    Drame
    The Happy Prince
    Drame
    Basquiat : un adolescent à New York
    Film documentaire
    Kanaa
    Drame
    Seethakaathi
    Drame
    Maari 2
    Film d'action
    Adanga Maru
    Film d'action
    Sonar
    Drame
    De boue
    Drame
    Mon père
    Drame
    Grass
    Drame
    L'Oeil du tigre
    Film documentaire
    sinon ça donne ç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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Le Retour de Mary Poppins
    2.4
    www.dailymotion.com/embed/video/x6tqzou?autoPlay=1
    Film fantastique
    Aquaman
    1.7
    www.dailymotion.com/embed/video/x6xmdq0?autoPlay=1
    Film fantastique
    L'Empereur de Paris
    2.4
    www.dailymotion.com/embed/video/x6w4iqz?autoPlay=1
    Drame
    Le Gendre de ma vie
    2.6
    www.dailymotion.com/embed/video/x6wf3ks?autoPlay=1
    Comédie
    Wildlife : une saison ardente
    4
    www.dailymotion.com/embed/video/x6ycr5h?autoPlay=1
    Drame
    Masha et Michka : les nouvelles aventures
    1.5
    www.dailymotion.com/embed/video/x6z9bg2?autoPlay=1
    Drame
    Basquiat : un adolescent à New York
    3
    www.dailymotion.com/embed/video/x6ycov1?autoPlay=1
    Drame
    Grass
    3
    www.dailymotion.com/embed/video/x6ycsbd?autoPlay=1
    Film documentaire
    Merci d'avance

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 426
    Par défaut
    Bonjour,

    Avant de donner une idée, peut-on m'expliquer le code donné ?
    Car pour moi, il ne fonctionne pas...

    Sinon, dans la discussion précédente, j'ai fourni un code qui aurait pu t'aider (la partie boucle pour lire un fichier ligne à ligne et savoir qu'elle filtre on a appliqué).

    Comme l'avait dit N_BaH, si on a auparavant établi un algo que l'on développe ensuite, c'est plus simple à modifier.

  3. #3
    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
    (re-)salut,

    pour info :
    http://www.allocine.fr/service/conditions.html#cgu
    8. Obligations et responsabilité des Utilisateurs
    • 8.1. Utilisation du Site et des Services
      • L’Utilisateur est ainsi tenu de ne pas utiliser les Services pour notamment (...) utiliser ou lancer un système automatisé (notamment robot, spider (...)
    ajoute à ça -et comme on te l'a déjà dit dans la discussion précédente- faire tout ça avec bash et les commandes gnu est malgré tout hyper galère et pas très fiable, d'autant que tu restes avec grep/sed/cut alors que d'autres outils plus performants t'ont été proposé dans la discussion précédente, perso à ce stade je pense que j'en aurai déjà eu marre et j'aurai opté pour Python + BeautifulSoup par exemple

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut
    ajoute à ça -et comme on te l'a déjà dit dans la discussion précédente- faire tout ça avec bash et les commandes gnu est malgré tout hyper galère et pas très fiable, d'autant que tu restes avec grep/sed/cut alors que d'autres outils plus performants t'ont été proposé dans la discussion précédente, perso à ce stade je pense que j'en aurai déjà eu marre et j'aurai opté pour Python + BeautifulSoup par exemple
    En fait j'ai pas le choix, étant donné que c'est un devoir donné par l'un de mes professeur.

    Avant de donner une idée, peut-on m'expliquer le code donné ?
    Car pour moi, il ne fonctionne pas...
    Sachant que Prem*.txt correspond au curl des pages du site premiere pour chaque film, mis à la suite les uns des autres.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 426
    Par défaut
    Citation Envoyé par Chadoxis Voir le message
    Sachant que Prem*.txt correspond au curl des pages du site premiere pour chaque film, mis à la suite les uns des autres.
    Et ?
    Explique ton code (je persiste, celui-ci ne fonctionne pas)

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (( i=0; i<=100; i++));
    do
    	egrep -m 1 \<meta\ property\=\"og\:title\" | cut -d\" -f4 | sed -re "s/'/\'/g" >> AZER.txt #les titres
    	egrep -m 1 ratingValue | sed 's/^[ \t]*//;s/[ \t]*$//' | cut -d\" -f4 >> AZER.txt #les notes
    	egrep -m 1 allowfull | cut -d\/ -f3-6 | cut -d\" -f1 >> AZER.txt #les bandes annonce
    	egrep -m 1 td\ data-heading\=\"Genre\" | cut -d\< -f3 | cut -d\> -f2 | sed -re "s/'/\'/g" >> AZER.txt # les genres
     
    done < Prem*.txt
    Pour i allant de 0 à 100 (il n'y aura jamais 100 films par semaine) on fait :
    - recuperer la premiere occurence de <meta\ property\=\"og\:title\" dans Prem*.txt, que l'on rend "beau" avec les cut et sed, et on le met dans AZER.txt, donc on récup le TITRE1
    - recuerer la premiere occurence de ratingValue et le mettre dans AZER.txt, donc on récup la NOTE1
    ect

    ça marche très bien chez moi, les seuls pb sont du au fait que quand il n'y a pas de note, ça saute tous les films jusqu'au suivant possédant une note.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 426
    Par défaut
    Si ton code précédent fonctionnait, le code suivant devrait retourner les 2 lignes (titi et toto) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo -e "titi\ntoto" | for (( i=0 ; i<=2 ; i++ )); do egrep -m 1  toto  ; egrep -m 1 titi ; done
    toto
    Malheureusement, ça ne retourne que toto qui est la recherche du premier egrep...

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 14
    Par défaut
    ça ne fonctionne que si les lignes ne se suivent pas, et dans mon fichier elles ne se suivent pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    echo -e "toto\nsalut\ntata" > test.txt
    for (( i=0 ; i<=2 ; i++ )); 
    do 
    	egrep -m 1 toto >> TEST.txt
    	egrep -m 1 tata >> TEST.txt
    done < test.txt
     
    toto
    tata

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 426
    Par défaut
    Non, tu es loin du compte:
    1. Ça ne fonctionne qu'avec des fichiers réguliers, donc pas avec des fifo et autres pipe (en fait, on dit qu'il faut que le fichier soit "seekable").
    2. Le premier egrep -m 1 épuise les lignes jusqu'à avoir trouvé son pattern, ensuite c'est le second qui prend la relève et ainsi de suite. Ce qui veut dire que si le premier egrep par exemple, ne trouve pas le pattern, alors il lira la totalité des fichiers et donc les autres egrep ne feront rien. En gros, dans cette façon de faire, des qu'un egrep foire, c'est fini.


    Alors qu'un style plus courant du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while read ligne
    do
       egrep pattern <<<"$ligne" | cmd ... | cmd ... >>fichier
       ....
       ....
    done <prem*.txt
    serait un peu plus propre.
    Après, faudra peut-être isoler chaque grep, c'est-à-dire passer à la ligne suivante dés qu'un des grep est ok car ici, une ligne passe dans tous les grep...

    Et se sera plus simple de savoir si une donnée est manquante ou pas

  10. #10
    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,

    Une idée comme une autre pour essayer de faire avancer le schmilblick

    Après avoir récupéré le code source de 5 films ("Bumblebee", "Mia et le Lion blanc", "Au bout des doigts", "Monsieur" et "Top Gun : Maverick"), j'ai extrait une toute petite partie de ce code dans un seul fichier avec la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/main-header main-header--detail/,/rating-value/p' <(w3m -T text/html code_source_film.html) >> fich
    Puis j'ai lancé un "grep" sur ledit fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po '(post-title">\K[^<]*)|(taxonomy/term/.*name">\K[^<]*)|(allowfullscreen.*src="//\K[^?]*)|(rating-value">\K[^ (]*)' fich | sed "s/\'/'/"
    Ce qui m'a donné 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
    Film d'action
    Bumblebee
    www.dailymotion.com/embed/video/x6l3i7c
    3.0
    Film d'aventures
    Mia et le Lion blanc
    www.dailymotion.com/embed/video/x6rn20l
    2.6
    Comédie
    Au bout des doigts
    www.dailymotion.com/embed/video/x6yf97l
    2.4
    Drame
    Monsieur
    www.dailymotion.com/embed/video/x6yfajd
    Film d'action
    Top Gun : Maverick
    2.5
    Alors, les données ne sont pas tout à fait dans l'ordre désiré, mais elles sont là
    À savoir que pour les 2 derniers films, l'un n'avait pas de note et l'autre pas de BA.

    Voilà, si d'autres veulent apporter leur contribution afin de finaliser l'ensemble… yapluka

    Bonne fin d'année 2018 à toutes z'et à tous

    Édit : il faut lire sed "s/\'/'/" (la prévisualisation affiche le bon code, mais à l'enregistrement, le code HTML est interprété

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/11/2005, 13h04
  2. Problème de champs Paradox type : mémo formaté
    Par mjp dans le forum Bases de données
    Réponses: 6
    Dernier message: 05/04/2005, 22h13
  3. Problème de champs texte
    Par Benjamin76 dans le forum Access
    Réponses: 1
    Dernier message: 07/01/2005, 12h13
  4. Problème de champs vierge dans un regroupement
    Par GrisburT dans le forum Oracle
    Réponses: 8
    Dernier message: 09/12/2004, 12h08
  5. [CR7][VB6]Problème de champs
    Par jcdupayage dans le forum SDK
    Réponses: 5
    Dernier message: 19/07/2004, 15h54

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