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 :

extraire une chaine entre un mot et un caractére


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut extraire une chaine entre un mot et un caractére
    Bonsoir,

    j'ai crée une fonction pour extraire le texte situé entre un mot et un caractère que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Function Extraction(ByVal attente As String) As String
            Dim motARechercher1 As String = "Intervention"
            Dim motARechercher2 As String = "Fin"
            Dim fin1 As Integer = attente.IndexOf(motARechercher1, 0, System.StringComparison.InvariantCultureIgnoreCase)
            Dim fin2 As Integer = attente.IndexOf(motARechercher2, 0)
            Return attente.Substring(fin1, fin2)
        End Function
    Lorsque la variable "attente" ce présente de ce façon pas de problème :

    Intervention 95407639
    transfert hospitalier
    urgent
    3 rue des lilas
    Fin


    Mais parfois il arrive que "attente" se présente de cette façon :

    Intervention 95407639
    transfert hospitalier
    urgent
    3 rue des lilas
    Fin
    Intervention 95407656
    transfert intra-hospitalier
    urgent
    3 rue de la république
    Fin


    et dans ce cas je récupère tous le texte alors que je voudrais récupéré seulement le texte situé avant la première apparition de "Fin", ceci :

    Intervention 95407639
    transfert hospitalier
    urgent
    3 rue des lilas
    Fin


    auriez vous une idée à me donner ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bah je viens de tester ton code, pour moi ça fonctionne bien

    Par contre tu vas avoir un problème si par exemple l'adresse contient "Fin"... Tu ferais mieux de traiter ça ligne par ligne, et de t'arrêter quand la ligne entière est égale à "Fin"

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Oui j'ai fait un parcours ligne par ligne dans une méthode (Affiche_ASCII) qui appel la fonction (Extraction), que voici : (ça doit être ici que ça bug, car parfois ça fonctionne, j’obtiens bien tout avant fin et parfois j obtient plus que le mot fin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Private Sub Affiche_ASCII()
     
            For Each ligne As String In TextBox2.Text 'dans cette textbx j'ai toutes données avec plusieurs fois le mot Fin
                Try
                    TextBox1.Text = Extraction(Textbox2.Text)
                Catch ex As Exception
     
                End Try
            Next
        End Sub

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par gastoncs Voir le message
    : (ça doit être ici que ça bug, car parfois ça fonctionne, j’obtiens bien tout avant fin et parfois j obtient plus que le mot fin)
    C'est limpide .....

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par gastoncs Voir le message
    Oui j'ai fait un parcours ligne par ligne dans une méthode (Affiche_ASCII) qui appel la fonction (Extraction), que voici : (ça doit être ici que ça bug, car parfois ça fonctionne, j’obtiens bien tout avant fin et parfois j obtient plus que le mot fin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Private Sub Affiche_ASCII()
     
            For Each ligne As String In TextBox2.Text 'dans cette textbx j'ai toutes données avec plusieurs fois le mot Fin
                Try
                    TextBox1.Text = Extraction(Textbox2.Text)
                Catch ex As Exception
     
                End Try
            Next
        End Sub
    Ce code n'a aucun sens, tu n'utilises jamais la variable de boucle... en plus, tu boucles sur les caractères et non sur les lignes. Donc en fait tu exécutes Extraction autant de fois qu'il y a de caractères, ce qui ne sert à rien (une fois suffirait)

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    oui je comprend, mais je ne sais pas comment faire pour boucler sur les lignes !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Tu peux faire un Split selon le caractère de saut de ligne, mais c'est pas très pratique ; perso je préfère utiliser un StringReader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Imports System.IO
     
    ...
     
    Using reader As New StringReader(TextBox2.Text)
        Dim line As String = reader.ReadLine()
        While line IsNot Nothing
            ...
            line = reader.ReadLine()
        End While
    End Using

  8. #8
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    ok, et ou est ce que je place mon mot de début (Intervention) et de fin (Fin) entre lesquels je dois extraire ?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bon, on va reprendre depuis le début, parce je sais pas si j'ai bien compris ce que tu voulais...

    Tu as un texte comme ça :
    Intervention 95407639
    transfert hospitalier
    urgent
    3 rue des lilas
    Fin
    Intervention 95407656
    transfert intra-hospitalier
    urgent
    3 rue de la république
    Fin
    Et tu veux en extraire ça :
    Intervention 95407639
    transfert hospitalier
    urgent
    3 rue des lilas
    Mais qu'est-ce que tu fais du texte qui suit ? Tu veux pas extraire les infos de la 2e intervention ?

  10. #10
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    exactement c'est bien ça !

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    de plus pq ne pas extraire les informations dans une classes "Transfert"
    {
    long NoIntervention
    string TypeTransfert
    string Severité
    string Adresse
    }

  12. #12
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    je fais le traitement un peu plus loin dans les informations que je récupère !

    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
     
     
     
     'adresse
                        Dim debut_adresse As Integer = TextBox1.Text.IndexOf("Adresse : ")
                        If debut_adresse = -1 Then
                            adresse_s = "inconnue"
                        Else
                            debut_adresse = debut_adresse + 10
                            Dim fin_adresse As Integer = TextBox1.Text.IndexOf(ControlChars.NewLine, debut_adresse)
                            If fin_adresse = -1 Then
                                adresse_s = "inconnue"
                            Else
                                Dim longeur_adresse As Integer = fin_adresse - debut_adresse
                                adresse_s = TextBox1.Text.Substring(debut_adresse, longeur_adresse)
                            End If
                        End If
                        'nature
                        Dim debut_nature As Integer = TextBox1.Text.IndexOf("Nature : ")
                        If debut_nature = -1 Then
                            motif_depart = "inconnue"
                        Else
                            debut_nature = debut_nature + 9
                            Dim fin_nature As Integer = TextBox1.Text.IndexOf(ControlChars.NewLine, debut_nature)
                            If fin_nature = -1 Then
                                motif_depart = "inconnue"
                            Else
                                Dim longeur_nature As Integer = fin_nature - debut_nature
                                motif_depart = TextBox1.Text.Substring(debut_nature, longeur_nature)
                            End If
                        End If
                        'severite
    'etc......
    mais pour ce faire il faut que j'arrive à recupéré seulement ce que j'ai entre Intervention et Fin !

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    Tu as toujours le meme nombre de champs?
    NoIntervention
    TypeTransfer
    Urgent
    Adresse
    ou certains sont optionel?

  14. #14
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    malheureusement certains son optionnel, je cherche juste à récupérer les lignes entre les lignes contenants "Intervention" et "Fin".

    j'ai essayé ceci, ainsi j'affiche dans une boite de dialogue chaque ligne, il me reste à trouver le moyen pour afficher seulement les lignes entre "Intervention" et "Fin" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Using reader As New StringReader(TextBox2.Text)
                Dim line As String = reader.ReadLine()
                While line IsNot Nothing
                    line = reader.ReadLine()
                    MsgBox(line)
                End While
            End Using

    Pour le traitement qui suit afin de récupérer les données pas de problème.

  15. #15
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    Je ferai quelque chose du genre
    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
    Dim arrStr() As String = textBrut.Split(Environment.NewLine)
    Dim listTransfert As List(of Transfert) = new List(of Transfer)()
    Dim transfert  As Transfert
    Dim i As Integer = 0;
    ForEach(line in arrStr)
    {
    if(larrStr[i].Contain(Intervention))  then
    {
    transfer = new Tranfert()
    transfer.ListLines = new List(of String)
    transfer.ListLines.Add(line)
    }
    else if(line="Fin") then
    { 
    transfert.ConvertLine();
    listTransfert.Add(transfert)
    }
    else
    transfer.ListLines.Add(line)
     
    }
    }

  16. #16
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    j'ai essayé ton code Benoit M, mais trop complexe pour moi !

    pour faire plus simple, si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Dim unique As String
            For Each ligne As String In TextBox2.Text.Split(ControlChars.NewLine)
                If ligne.Contains("Intervention") Then
     
                End If
     
            Next
    je repère la ligne qui contient intervention ce que j'ai fait maintenant il faut que je trouve celle ou il y a Fin et que j'extrait dans ma variable unique tous ce qui se trouve entre !

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Moi j'aurais fait ç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
        Public Function Extraction(ByVal attente As String) As String
            Using reader As New StringReader(attente)
                Dim result As StringBuilder = Nothing
                Dim line As String = reader.ReadLine()
                While line IsNot Nothing
                    If line.StartsWith("Intervention") Then
                        result = New StringBuilder()
                    End If
                    If line = "Fin" Then
                        Exit While
                    End If
                    If result IsNot Nothing Then
                        result.AppendLine(line)
                    End If
                    line = reader.ReadLine()
                End While
                If result IsNot Nothing Then
                    Return result.ToString()
                Else
                    Return Nothing
                End If
            End Using
        End Function
     
     
        ...
     
        TextBox1.Text = Extraction(TextBox2.Text)

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par gastoncs Voir le message
    j'ai essayé ton code Benoit M, mais trop complexe pour moi !
    C'est surtout un mélange de VB.NET et de C#, donc ça veut pas dire grand chose... on va dire que c'est du pseudo code

  19. #19
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour gastoncs
    Quelque soit le texte à analyser ,il faudrait tout d'abord utiliser LastIndexOf qui permet de se positionner en fin de chaine ....
    Ensuite on remonte -à rebours- en cherchant avec EndsWith et LastIndexOf
    Voici comment il faudrait revoir extraction que microsoft prefere appeler StripEndTags...
    le code:
    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
     
    Public Class Form1
        'textbox2 contient ton texte a analyser
        'textbox1 contient le resulat souhaite
        Private Sub btnSearchString_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchString.Click
     
            textBox1.Text = StripEndTags(TextBox2.Text)
     
        End Sub
        'Fonction extract qui cherche -à rebours- en partant du dernier texte "Fin" trouve
        'et remonte en arriere jusqu'à ce qu'elle trouve le premier texte "Intervention" 
        Private Shared Function StripEndTags(ByVal item As String) As String
     
            ' try to find a tag "Fin" at the end of the line using EndsWith
            If item.Trim().EndsWith("Fin") Then
     
                ' now search for the opening tag "Intervention"...
                Dim lastLocation As Integer = item.LastIndexOf("Intervention")
                If lastLocation >= 0 Then
                    ' remove the non-identified section, if it is a valid region
                    item = item.Substring(lastLocation, item.Length - lastLocation)
                End If
            End If
     
            Return item
        End Function 'StripEndTags
    bon code..............

  20. #20
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    merci tomlev ça fonctionne bien quand Intervention est seul mais lorsque il y a un numéro derrière ça ne fonctionne pas !
    comment puis je modifier ça ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Extraire une chaine entre 2 caractères identiques
    Par nicomax34 dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2014, 10h39
  2. [RegEx] comment récupérer une chaine entre deux mots
    Par mat8883 dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2012, 19h29
  3. Extraire une chaine entre parenthèse
    Par flo73 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 16/10/2010, 12h14
  4. Extraire une chaine entre guillemets
    Par grenouille2008 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 01/07/2008, 16h40
  5. Réponses: 14
    Dernier message: 12/12/2007, 17h08

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