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

VB.NET Discussion :

Identifier les mots dans une chaine-string et leurs longueurs


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut Identifier les mots dans une chaine-string et leurs longueurs
    Bonsoir,

    J'ai pas mal cherché, bien galéré, un peu trouvé mais pas vraiment ce que je désire.
    Alors que d'autres langages gèrent très bien les extractions de mots dans un chaine ( rexx, sas, ... ),
    il semble que VB ait un peu de difficulté. Enfin MOI j'ai des difficultés.

    J'utilise la fionction? expression? split mais je ne la maitrise pas.
    Deux problèmes à résoudre : les mots sont séparés par plusieurs espaces non connus ( je parle de lignes dans un fichier ).
    Ensuite un problème de performance. Essentiel.

    exemple j'ai une chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00000049910066          360       593626
    Je voudrais connaitre
    1. le nombre de mots à partir de la position 11 de la ligne
    2. reconnaitre ces mots et pouvoir determiner leur longueur

    Ici
    3 pour le nombre de mots
    et
    longueur mot 1 = 4
    longueur mot 2 = 3
    longueur mot 3 = 6


    Le Split me ramène 13 ???? comme ? nombre de mots? position du blanc?
    Je ne m'y retrouve pas.

    Merci de vos indications vers lequelles je dois aller.


    Pierre

  2. #2
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Salut

    tes chaines sont toujours de la meme structure ?

    XXXXXXXXX YYYYYYYY YYYYYY

  3. #3
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    peut etre

    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
     Dim mystr As String
            Dim mots() As String
            Dim listwordlength As New List(Of Integer)
            mystr = "00000049910066          360       593626"
            mots = mystr.Split(" "c)
            For iter = 0 To mots.Length - 1
                If mots(iter) <> String.Empty Then
                    If iter = 0 Then
                        listwordlength.Add(mots(iter).Substring(10).Length)
                    Else
                        listwordlength.Add(mots(iter).Length)
                    End If
     
                End If
            Next

  4. #4
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut
    Merci des réponses rapides.

    Non chaque ligne contient quasi tout le temps 3 mots, mais de longueurs et positions variables.
    Dans certains cas rares, un mot , deux mots ou même que des espaces ( blancs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    9999999999  999        99999
    888888888   88    88888888
    77777777777777           777       77777777
    Pour le code fourni ( merci ), il est un peu tard. Mais j'essaie demain et reviens avec mes essais.

    Pierre

  5. #5
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Alors que d'autres langages gèrent très bien les extractions de mots dans un chaine ( rexx, sas, ... ), il semble que VB ait un peu de difficulté.
    Sinon tu as les REGEX, qui sont sont fait pour les recherche d'expression dans des chaînes de caractères.

    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
        Sub Main()
     
            Dim str = "00000049910066          360       593626"
            str = str.Substring(10)
     
            'recherche de mots
            Dim reg As New Regex("[0-9]+")
            Dim results = reg.Matches(str)
     
            'Nombre de mot
            Console.WriteLine("Nombre de mot: {0}", results.Count)
     
            'Liste des mots et leurs longueurs
            For Each r As Match In results
                Dim word As String = r.Value
                Console.WriteLine("mot: {0}, longueur: {1}", {word, word.Length})
            Next
     
        End Sub
    Nombre de mot: 3
    mot: 0066, longueur: 4
    mot: 360, longueur: 3
    mot: 593626, longueur: 6
    Tu devrais lire le cours, tu apprendrais plein de choses..

  6. #6
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.
    Voici le code pour séparer les mots en virant les chaînes vides. Note l'usage de StringSplitOptions. Il faut penser à regarder les surcharges (et utiliser le débogueur pour comprendre ce qui cloche).

    En C# :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    root.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

    Conversion automatique vers VB :
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    root.Split(New Char() {" "C}, StringSplitOptions.RemoveEmptyEntries)

    PS : Split est une "méthode". Au pire, "fonction".

    PPS : Pour le coup des mots à partir de la position N, on cherchera d'abord l'index k du premier espace à partir de la position N - 1 avec String.IndexOf(" "C, N-1) puis on utilisera String.Substring(k + 1). Gaffe au cas où k est trop grand.

    PPPS : Si un problème de performances est constaté, on peut tenter de désactiver l'interning des strings (google, "disable string interning dotnet") ou bien d'utiliser une approche plus manuelle en n'utilisant qu'IndexOf et pas Split si on n'a pas besoin de connaître les mots eux-mêmes mais seulement leurs positions. Pour IndexOf, la surcharge avec StringComparaison doit pouvoir permettre de booster encore le tout. Enfin, si tout cela finit par être concaténé, c'est sans doute là qu'est le problème et on gagnera à utiliser un StringBuilder.

Discussions similaires

  1. Compter les nombres de mots dans une chaine
    Par CLeBeR dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2014, 20h39
  2. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  3. trouver les mots dans une chaine
    Par thierry007 dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/04/2010, 09h30
  4. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  5. [LG]Retirer les blancs dans une chaine
    Par Andy_24DB dans le forum Langage
    Réponses: 16
    Dernier message: 25/02/2004, 16h30

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