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

Windows Forms Discussion :

[VB.NET]comment on filtre des chaines de caractères ?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut [VB.NET]comment on filtre des chaines de caractères ?
    salut!
    je veux savoir comment je pourrais filtrer des chaines de caractères que je lis depuis un fichier texte.
    par exemple ici comment je peux filtrer les chaines qui sont entre "A_" et ":"?:
    SG_ CMPT_PROC4 : test(1,0)
    A_ CHECK_SUM_CMD_BRI_1 : test(1,0)
    A_ SBRI1_2 : test(1,0)

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Utilise les expressions régulières !!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    j'ai testé les expressions régulières!
    (voilà un extrait d'une discussion que j'ai lancé tout à l'heure et j'ai pas eu de réponses!!)

    exemple de lignes où je détecte cette chaine de caractères:
    SG_ CMPT_PROC4 :
    SG_ CHECK_SUM_CMD_BRI_1 :

    j'ai ecris ce code

    Code :
    Public Function Func1(ByVal line As String) As String
    Dim r As New RegularExpressions.Regex("[0-9]+", RegularExpressions.RegexOptions.Compiled)
    Return r.Match(line).Groups(0).Value
    End Function

    Public Function Func2(ByVal line2 As String) As String
    Dim r As New RegularExpressions.Regex("[_][\s][a-zA-Z0-9]+[_]?[a-zA-Z0-9]+", RegularExpressions.RegexOptions.Compiled)
    Return r.Match(line2).Groups(0).Value
    End Function

    Public Sub lecture(ByVal fichier As String)
    Do
    ligne = SR.ReadLine()
    Loop Until (str = ligne.IndexOf("BO_"))
    ID = Func1(ligne)
    SW.WriteLine(ID)
    SW.WriteLine("ID_received =" & ID)
    Do
    If str = ligne.IndexOf("BO_") Then
    ligne2 = SR.ReadLine()
    donnée = Func2(ligne2)
    SW.WriteLine("Dim" & donnée & " as integer")
    End If
    Loop Until chaine <> ligne2.IndexOf(" SG_") '& ligne2.LastIndexOf(":")
    SR.Close()
    SW.Close()
    End Sub
    et sur le fichier texte j'ai:

    70
    ID_received =70
    Dim_ CMPT_PROC4 as integer
    Dim_ CHECK_SUM as integer
    Dim_ SBRI1_2 as integer
    Dim_ SBRI1_1 as integer
    Dim_ SBRI1_0 as integer
    Dim_ SBRI5_2 as integer
    Dim_ SBRI5_3 as integer
    Dim_ SBRI5_1 as integer
    Dim_ int_anti as integer
    Dim_ int_anti as integer
    Dim as integer
    mais j'ai toujours "l'underscore" (_) au début et j'arrive pas à récupérer une longue chaine comme : CHECK_SUM_CMD_BRI_1 et je récupère juste CHECK_SUM.
    j'ai bien fouillé dans les expressions régulières mais j'ai pas trouvé de solutions parfaites pour cette application.

  4. #4
    Membre expérimenté Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Par défaut
    Re,
    je ne pourrai pas t'aider avec les Regex mais pourquoi pas un substring avec comme départ un IndexOf de "A_" et longueur un différence des IndexOf de ":" et de "_A" ?
    Sinon comme proposé dans un autre post tu Split sur "A_" puis après test d'existence tu Split sur ":" et là tu aura ta chaîne recherchée...
    C'est du bidouillage mais ça marche...enfin à mon avis

  5. #5
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Essai ça ça devrait marcher (attention, c'est en C#, mais seule l'expression régulière compte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		string txt = textBox1.Text;
    			string regexp = @"[^_]*[^a-zA-Z0-9]+([^:]*)";
    			string result = string.Empty;
    			Regex rg = new Regex(regexp);
     
    			// code
    			if (rg.IsMatch(txt))
    			{
    			result = rg.Match(txt).Groups[1].Captures[0].Value;
    			}

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    sa donne toujours rien !
    donc soit j'ai mal codé ton code en VB soit sa donne rien !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    merci toniolol pour ton idée mais je vois pas comment je pourrais le coder...

  8. #8
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    bizarre... pourtant j'ai essayé chez moi et ça marche nickel...
    Juste j'ai supposé que la chaine en entrée (txt) était une seule ligne (genre A_ CHECK_SUM_CMD_BRI_1 : test(1,0) ) uniquement

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    salut!
    toujours des soucis avec sa et sa me gonfle!!!
    comme déjà indiqué dans le code précédent, ce truc c'est un casse tête !
    J'ai écris ce code pour pouvoir récupérer un nombre borné entre ":" et "|" d'une ligne comme celle là:

    BO_ 257 Trm_CMD_VAIO_P2: 7 VAIO
    SG_ libre_4 : 31|4@0+ (1,0) [0|15] "" Vector__XXX

    pour récupérer ce nombre en rouge j'ai utilisé 2 méthodes :
    1
    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
     
    Do
                If str = ligne.IndexOf("BO_") Then
                    ligne2 = SR.ReadLine()
                    tabS3 = Split(ligne2, ":")
                    If tabS3.Length > 1 Then
                        tabS4 = Split(tabS3(1), "|")
                        If tabS4.Length > 1 Then
                            position_bit = tabS4(0)
                            SW.WriteLine("")
                            SW.WriteLine(position_bit)
                        End If
                    End If
                End If
            Loop Until chaine <> ligne2.IndexOf(" SG_")
    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Public Function Func2(ByVal line2 As String) As String
            Dim r As New RegularExpressions.Regex("[\s][0-9]+", RegularExpressions.RegexOptions.Compiled)
            Return r.Match(line2).Groups(0).Value
        End Function
     
            Do
                Do
                    ligne2 = SR.ReadLine()
                    position_bit = Func2(ligne2)
                Loop Until chaine <> ligne2.IndexOf(" SG_")
            Loop Until (str = ligne.IndexOf("BO_"))
    et je dois récupérer aussi le nombre entre le "|" et le "@".
    mais toujours rien et je dois résoudre le PB avant demain sinon chui mort !!
    j'attends votre réponse SVP.......

  10. #10
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Quel est la ligne ? la 11 ou la 2) ??

    1)
    SG_ libre_4 : 31|4@0+ (1,0) [0|15] "" Vector__XXX

    2)
    BO_ 257 Trm_CMD_VAIO_P2: 7 VAIO SG_ libre_4 : 31|4@0+ (1,0) [0|15] "" Vector__XXX

  11. #11
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Et autre question, est-ce toujours un chiffre qui se trouvera entre ":" et "|" et entre "|" et "@" ??

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    ce qui m'interesse est dans la ligne 1
    SG_ libre_4 : 31|4@0+ (1,0) [0|15] "" Vector__XXX
    tout les nombres en rouge je dois les récupérer...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    j'ai essayé les expressions régulières et sa ne donne rien sa me retourne ceux qui sont sur l'autre ligne...

  14. #14
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    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
    private void button1_Click(object sender, EventArgs e)
    {
    	string txt = textBox1.Text;
    	string regexp = @"[^:]*\s([0-9]+)\|([0-9]+)@[^\[]*\[([0-9]+)\|([0-9]+)[\[\w]*";
    	string result = string.Empty;
    	Regex rg = new Regex(regexp);
     
    	// code
    	if (rg.IsMatch(txt))
    	{
    		int cpt = 0;
    		foreach (Group g in rg.Match(txt).Groups)
    		{
    			if (cpt > 0)
    			{
    				result += "\r\nGROUP " + cpt.ToString() + "\r\n";
    				foreach (Capture c in g.Captures)
    				{
    					result += c.Value + "\r\n";
    				}
    			}
    			cpt++;
    		}
    	}
     
    	label1.Text = result;
    }

    Résultat pour SG_ libre_4 : 31|4@0+ (1,0) [0|15] "" Vector__XXX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    GROUP 1
    31
     
    GROUP 2
    4
     
    GROUP 3
    0
     
    GROUP 4 
    15
    Donc ce qui compte c'est tooujours l'expression régulière, et les données sont dans les collectionsgroup 1, 2, 3 et 4 (Captures 0 à chaque fois)

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 137
    Par défaut
    c'est sa ce que je n'ai pas compris comment sa marche les groupcollection ?

Discussions similaires

  1. Comment trier des chaines de caractères
    Par SPACHFR dans le forum Débuter
    Réponses: 9
    Dernier message: 18/12/2009, 18h08
  2. code de filtre et tri des chaines de caractères
    Par fatenatwork dans le forum Collection et Stream
    Réponses: 18
    Dernier message: 12/03/2008, 16h31
  3. Filtre des chaines de caractères en Java
    Par fatenatwork dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 28/01/2008, 11h11
  4. [VB.NET] comment docker avec des marges entre controles ?
    Par lacsap49 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/11/2006, 16h59
  5. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25

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