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

  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.

  7. #7
    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
    Pour Shayw
    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
    J'ai quelques problèmes avec ce code.
    "mots" retourne length=18 donc la liste va contenir 18 items, alors que je n'en demande que 3.
    Il faudrait utiliser un nouvel index "iter2" par exemple à n'incrémenter qu'en cas de mots(iter) <> string.empty, de façon que le add à la liste soir indexé sur cet index.

    Quelque chose comme ;
    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
    Dim mystr As String
            Dim iter2 as integer = 0
            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
                    iter2 = iter2 + 1 
                    If iter = 0 Then
                        listwordlength.Add(mots(iter2).Substring(10).Length)
                    Else
                        listwordlength.Add(mots(iter2).Length)
                    End If
     
                End If
            Next
    ... et je me rends compte que pour mon application, je dois aussi avoir la position de départ de chaque mot. Comment recevoir cela?r

    Tests : 5 secondes pour 10.000.000 passes en boucle.

    Merci


    Pierre

  8. #8
    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
    A -N4w4k-


    Cela fonctionne très bien avec les REGEX et le code fourni,
    mais .....mais un énorme et rédhibitoire défaut, la performance.

    103 secondes pour 10.000.000 de processes.

    A côté des 5 secondes de mon autre test. !!!!

    Or la performance est essentielle en ce sens que je traite des millions de records, et que évidemment le split n'est pas le seul process de mon application.

    Merci néanmoins de m'avoir montrer REGEX et le cours.

    Pierre

  9. #9
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Tu peux essayer de créer ta Regex avec l'option Compiled
    http://www.codinghorror.com/blog/200...o-compile.html

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    Citation Envoyé par PeD012 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            mots = mystr.Split(" "c)
    J'ai quelques problèmes avec ce code.
    "mots" retourne length=18 donc la liste va contenir 18 items, alors que je n'en demande que 3.
    Normal, chaque espace entre deux espaces est comptabilisé.
    DonQuiche t'a donné la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mots = mystr.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)

  11. #11
    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
    A chrismonoye,

    merci, mais j'experimentais chaque code et je les commentais séparémment.
    J'avais vu ( testé ) que r"emoveemptyentries" était bien ce que je cherchais.

    Reste la possibilité d'avoir la positon de départ de chque mot.


    Pierre

  12. #12
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim str = "00000049910066          360       593626"
            str = str.Substring(10)
            Dim mots = str.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
            Dim i1 = str.IndexOf(mots(0))
            Dim i2 = str.Substring(i1).IndexOf(mots(1)) + i1
            Dim i3 = str.Substring(i1 + i2).IndexOf(mots(2)) + i1 + i2
    Peut-être comme ça..

  13. #13
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    @-N4w4k- :
    c'est une bonne piste mais malheureusement si deux mot sont les mêmes il y aura un souci. EDIT : non vu les substring, mais je reste persuadé qu'un algo perso serait plus performant ^^

    Dans ce cas ci je pense que le plus performant serait de faire l’algorithme soit même, c'est vraiment pas compliqué, il suffit de boucler sur les chars du string et de faire le traitement approprié...

  14. #14
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    il suffit de boucler sur les chars du string et de faire le traitement approprié...
    +1, c'est l'application basique des automates à états finis, ici 2 états : mot_ cherché, mot_en_cours et des transitions dépendant du caractère rencontré (blanc/fin de ligne ou autre caractère).

  15. #15
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour PeD012
    comme l'as dit shayw,tu es sur la bonne voie sauf qu'il faut fait faire attention à l'utilisation de split .... car on obtient chaque mot simplement comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     'spliting words not characters.
            mots = Split(myStr)
            ' au lieu d'ecrire ceci :
            mots = myStr.Split(" "c)
            ' encore cette forme alambiquee:
            mots = myStr.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    ensuite toujours pour reprendre l'exemple de shayw et si tu veux recuperer l'index de chaque mot tu peux reprendre ton code modifie comme suit:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim mystr As String
     
            mystr = "00000049910066          360       593626"
            IdentifieMots(mystr)
            mystr = "888888888   88    88888888"
            IdentifieMots(mystr)
     
            mystr = "77777777777777           777       77777777"
            IdentifieMots(mystr)
        End Sub
        Private Sub IdentifieMots(ByVal myStr As String)
            Dim listwordlength As New List(Of Integer)
            Dim mots() As String
     
            'spliting words not characters.
            mots = Split(myStr)
     
            mots = Split(myStr)
            '  mots holds {"00000049910066", "          ", "360", "       ", "593626"}
            Dim LastNonEmpty As Integer = -1
            Dim indexMot As Integer = 0
            For i As Integer = 0 To mots.Length - 1
                If mots(i) <> "" Then
                    LastNonEmpty += 1
                    mots(LastNonEmpty) = mots(i)
                    listwordlength.Add(indexMot)
                    indexMot = indexMot + mots(LastNonEmpty).Length
                End If
            Next
            ReDim Preserve mots(LastNonEmpty)
            ' mots now holds {"00000049910066", "360", "593626"}
            For Each s As String In mots
                Me.TextBox1.Text = Me.TextBox1.Text & s & vbCrLf
     
            Next
            'les index de list commencent ....bien entendu  à zero
            For i As Integer = 0 To listwordlength.Count - 1
                Me.TextBox2.Text = Me.TextBox2.Text & listwordlength(i).ToString & vbCrLf
     
            Next
        End Sub
     
     
     
    End Class
    bon code..............

  16. #16
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Je donnes quand même une solution avec algo perso qui est à mon avis, comme je l'ai dit plus haut, plus performant qu'avec des splits et des redim... (Il serait intéressant à tester sur des collections de 10.000.000 de phrases comme demandé par PeD012)

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Imports System.Text
     
    Public Class Form1
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim laPhrase As New phrase("00000049910066          360       593626")
            laPhrase.traite()
            Debug.WriteLine(laPhrase.ToString)
        End Sub
     
        Private Class phrase
            Property laPhrase As String
            Property mots As List(Of mot)
     
            Public Sub New(laPhrase As String)
                _laPhrase = laPhrase
            End Sub
     
            Public Sub traite()
                mots = New List(Of mot)
                Dim motEnCours As mot = Nothing
                Dim sb As New StringBuilder
                Dim oldChar As Char = " "
     
                For i As Integer = 10 To laPhrase.Length - 1
                    If laPhrase(i) <> " " Then
                        ' si le char précédent était un blanc
                        If oldChar = " " Then
                            motEnCours = New mot
                            motEnCours.index = i
                            sb.Clear()
                            mots.Add(motEnCours)
                        End If
                        sb.Append(laPhrase(i))
                    Else
                        If oldChar <> " " Then
                            motEnCours.leMot = sb.ToString
                        End If
                    End If
                    oldChar = laPhrase(i)
                Next
     
                If oldChar <> " " Then
                    motEnCours.leMot = sb.ToString
                End If
            End Sub
     
            Public Overrides Function ToString() As String
                Dim sb As New StringBuilder
                sb.Append("Phrase : ")
                sb.AppendLine(laPhrase)
     
                If mots IsNot Nothing Then
                    For Each leMot As mot In mots
                        sb.Append(vbTab)
                        sb.AppendLine(leMot.ToString)
                    Next
                End If
     
                Return sb.ToString
            End Function
        End Class
     
        Private Class mot
            Property leMot As String
            Property index As Integer
     
            Public Overrides Function ToString() As String
     
                Return leMot & ", index : " & index & " longueur : " & leMot.Length
            End Function
     
        End Class
    End Class
    Citation Envoyé par sortie du debug
    Phrase : 00000049910066 360 593626
    0066, index : 10 longueur : 4
    360, index : 24 longueur : 3
    593626, index : 34 longueur : 6

  17. #17
    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 pour ces précisions et codes.

    Je vais expérimenter tout cela avec du volume pour mesurer la performance.

    PS : pour information, cette routine doit s'inscrire dans une application plus vaste qui gère des comparaisons de fichiers. Et évidemment ces fichiers pouvant venir de n'importe qui , de n'importe où ( enfin pas de Mars je crois ), ils peuvent être de tailles minuscules à immenses ( fichiers d'entreprises ). Je les predns comme ils viennent.

    Salut ... à bientôt

    Pierre

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    Sankasssss, j'ai testé ton algo sur un fichier de plus de 3 millions de lignes composées de 0 à 3 mots, soit près de 10 millions de boucles (ce dont parlait PeD012).
    Il est plus lent que l'utilisation d'un Split :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
        Dim listWordsFile As List(Of List(Of Word))
     
        Private Sub MainWords()
     
            Try
                Dim sWatch As Stopwatch = Stopwatch.StartNew()
                listWordsFile = New List(Of List(Of Word))
     
                ' Create an instance of StreamReader to read from a file.
                ' The using statement also closes the StreamReader.
                Using sr As New StreamReader(LoadFile)
     
                    Dim line As String
     
                    ' Read and display lines from the file until the end of
                    ' the file is reached.
                    Do
                        line = sr.ReadLine()
                        If Not (line Is Nothing) Then
     
                            ' Split string based on spaces
                            Dim words As String() = line.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
     
                            Dim listWordsLine As New List(Of Word)
                            Dim start As Integer = 0
     
                            For Each m In words
                                Dim mt As New Word(m)
                                mt.val = m
                                mt.length = m.Length
                                mt.position = line.IndexOf(m, start)
                                start = mt.length + mt.position
                                listWordsLine.Add(mt)
                            Next
                            listWordsFile.Add(listWordsLine)
                        End If
                    Loop Until line Is Nothing
                End Using
                sWatch.Stop()
     
                txtResult.AppendText("Elapsed time: " & sWatch.Elapsed.ToString & "  , Nbre groupes de words : " & listWordsFile.Count & vbCrLf)
            Catch e As Exception
                ' Let the user know what went wrong.
                Console.WriteLine("The file could not be read:")
                Console.WriteLine(e.Message)
            End Try
     
        End Sub
    Avec une petite class pour les mots contenus dans les lignes avec les éléments qui nous intéressent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class Word
     
        Public position As Integer
        Public val As String
        Public length As Integer
     
        Public Sub New(ByVal mt As String)
            Me.val = mt
        End Sub
    End Class
    Le traitement dure environ 7 secondes, le chargement dans une liste est coùteux, on passe à 20 secondes.
    C'est là que réside le soucis de performance, comment stocker les données?.
    Car l'intérêt est de récupérer les informations et en attendant mieux, pour connaitre celles d'une ligne quelconque (numLigne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub InfoLine(ByVal numLigne As Integer)
            Console.WriteLine("La ligne " & numLigne & " est composée de : " & listWordsFile.Item(numLigne).Count & " mot(s):" & vbCrLf)
            For Each mt As Word In listWordsFile.Item(numLigne)
                Console.WriteLine("Valeur : " & mt.val & " ,Position : " & mt.position & " ,Longueur : " & mt.length & vbCrLf)
            Next
     
        End Sub

  19. #19
    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
    Re-edit, j'ai confondu les posteurs.

    @PeD012
    Quel est le besoin *exact* ? Quel type de comparaison fais-tu ? Les fichiers évolueront-ils ou peut-on bâtir une représentation plus adaptée une fois pour toutes ?
    Avec une explication détaillée des besoins on pourra faire quelque chose d'efficace.

  20. #20
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    chrismonoye et en plus ton code est bien plus propre que tout ceux proposé.
    Y'en a un qui va être content, on a fait son travail à sa place


    Tien pour info (c'est toujours bien comparer), il est beaucoup plus lent où ca se joue à pas grand chose?

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, 21h39
  2. Réponses: 9
    Dernier message: 23/12/2013, 17h40
  3. trouver les mots dans une chaine
    Par thierry007 dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/04/2010, 10h30
  4. Réponses: 9
    Dernier message: 06/11/2007, 13h36
  5. [LG]Retirer les blancs dans une chaine
    Par Andy_24DB dans le forum Langage
    Réponses: 16
    Dernier message: 25/02/2004, 17h30

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