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

Python Discussion :

Splitter avec séparateur inconnu


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 299
    Par défaut Splitter avec séparateur inconnu
    Salut,

    Jai un soucis pour split parce que le separateur est pas toujours le meme d'une ligne a l'autre :
    Parfois j'ai du \t et parfois des espaces (dont le nombre varie !!!!!).

    Comment faire pour bien split svp ?

    Sachant que les valeurs entre separateurs sont soit des caractères chinois, soit des nombres.

    Merci de votre aide

  2. #2
    Membre émérite

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    Mars 2002
    Messages
    649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Je commencerais par essayer de normaliser les séparateurs et comme ce sont les espaces qui sont les plus mal structurés, j'essayerais une petite routine qui chaque fois qu'elle trouve une suite d'espaces (avec une boucle pour récupérer les espaces successifs) la remplace par \t
    Ensuite, on a plus qu'à découper.

  3. #3
    Membre éclairé
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Par défaut
    Bonjour,

    Je ferais simplement des split() avec chaque séparateur possible, et ensuite ne récupérerais que les valeurs non vides de la liste ainsi obtenue.
    https://docs.python.org/3/library/st...string-methods

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Je partirais sur une expression régulière (même si je déteste cela). Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import re
    string = 'A\tb C    dd'
    re.split('\s+', string)
    >>> ['A', 'b', 'C', 'dd']
    Le \s+ signifie "un certain nombre d'espaces". Il existe aussi \s*, mais je ne me souviens plus de la différence.

    Ciao,

    Julien

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 299
    Par défaut
    Merci tout le monde

    Citation Envoyé par Michel Voir le message
    Je commencerais par essayer de normaliser les séparateurs et comme ce sont les espaces qui sont les plus mal structurés
    Je vais essayer ca, pour l'instant j'ai fait ce code, je continue a me creuser la tete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #Go through the table tabTot to replace spaces with \t (and then decode)
    for k in range (0, len(tabTot)):#For each line...
        char = 0
        if tabTot[k][char] == ' ':#If the char is a space
            tabTot[k][char] == '\t'
            temp = char + 1#char is the position of the first space that we deleted to put \t
            while tabTot[k][temp] == ' ':#while we have more spaces we delete them
                tabTot[k][temp] = null
                temp += 1
        char += 1
    Citation Envoyé par LandReagan Voir le message
    Je ferais simplement des split() avec chaque séparateur possible
    Je veux pas faire 36 split sur mes fichiers

    EDIT : j'ai mis a jour le code. Et je n'avais pas vu ta réponse Julien, ca a l'air bien je vais essayer ca merci

    Citation Envoyé par Julien N Voir le message
    Je partirais sur une expression régulière (même si je déteste cela). Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import re
    string = 'A\tb C    dd'
    re.split('\s+', string)
    >>> ['A', 'b', 'C', 'dd']
    Le \s+ signifie "un certain nombre d'espaces". Il existe aussi \s*, mais je ne me souviens plus de la différence.
    Mais comment il sait pour remplacer le \t ?
    Pourquoi tu importes "re" ? J'ai pas compris le code en fait, comment ca peut fonctionner ?

    EDIT 2 : pas besoin de regex ni rien en fait ahahah, sur stackoverflow grace a ton messag eJulien je viens de voir que split() suffit pour les espaces et \t, pas besoin specifier le separateur apparement et ca a l'air de fonctionner !

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,
    Citation Envoyé par Anonyme1784 Voir le message
    Je veux pas faire 36 split sur mes fichiers
    Un seul suffit avec une expression comme ça :
    \s+
    qui signifie toute suite d'au moins un whitespace (qui comprend les espaces, les tabulations et d'autres)

    Si tu veux limiter à seulement espaces et tabulations :
    [\t ]+
    qui signifie au moins une tabulation ou une espace

    Si tu veux limiter à seulement soit une tabulation, soit au moins une espace :
    \t| +
    qui signifie une tabulation ou au moins une espace
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 299
    Par défaut
    Merci,

    est ce que split() sans rien dans les parentheses, equivaudrait pas a \t| + par hazard ?

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Anonyme1784 Voir le message
    est ce que split() sans rien dans les parentheses, equivaudrait pas a \t| + par hazard ?
    Plutôt \s+ (pour string.split())
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    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 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Anonyme1784 Voir le message
    Pourquoi tu importes "re" ? J'ai pas compris le code en fait, comment ca peut fonctionner ?
    Bonjour

    "re"est une librairie contenant des outils de manipulations des expressions régulières. Ainsi l'outil re.split() (à ne pas confondre avec le str.split() qui porte le même nom mais qui appartient à un autre objet) permet de splitter sur des expressions régulières.
    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]

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 299
    Par défaut
    Merci beaucoup, tout fonctionne bien

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

Discussions similaires

  1. [VBA-Excel] Calcul d'une formule avec une inconnue
    Par micwiss dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/10/2006, 16h04
  2. Extraction d'une chaine avec séparateurs
    Par kaceo dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/05/2006, 10h36
  3. Requete avec données inconnue
    Par MaitrePylos dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/01/2006, 15h06
  4. VB - Traitement de chaine avec séparateur
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/12/2005, 13h23
  5. Créer une liste avec taille inconnue
    Par C_C dans le forum Prolog
    Réponses: 3
    Dernier message: 19/11/2005, 12h46

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