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 :

Récupération plusieurs lignes d'un fichier texte [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut Récupération plusieurs lignes d'un fichier texte
    Bonjour,
    Suite à mon précédent post : http://www.developpez.net/forums/d15...fichier-texte/

    J'ai un fichier texte qui se présente sous cette forme :
    ...
    Valeur 0~120 1
    Valeur 1
    Valeur 2
    Valeur 3
    Valeur 4~120 3
    ...

    Je connais les balises ~120 1 et ~120 3 qui permettent de délimiter les lignes utiles. Je souhaite récupérer les valeurs 1, 2, 3 et 4.

    J'ai essayé de nombreuses solutions. Celle qui me parait la plus proche est la suivante :
    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
     
     Sub Lecture_donnees(Nom_fichier As String, Indice_recherche_1 As String, Indice_recherche_2 As String)
            For Each Ligne As String In System.IO.File.ReadLines(Nom_fichier)
                If Ligne.Contains(Indice_recherche_1) Then
                    Do Until Ligne.Contains(Indice_recherche_2)
                        If Ligne.Contains("~") Then
                            Valeur_trouvee = Valeur_trouvee & Ligne.Split("~")(0)
                            'Souci pour Ligne suivante
                        Else
                            Valeur_trouvee = Valeur_trouvee & Ligne
                            'Souci pour Ligne suivante
                        End If
                    Loop()
                End If
            Next Ligne
    End Sub
    Mon problème est que je ne parviens pas a faire "Ligne suivante" où je l'ai indiqué dans le code.

    Est ce que cela vient de la structure de mon code ? Est ce que je m'y prend pas du tout de la bonne façon ?

    Merci par avance.
    Cordialement.
    Merci de ainsi que d'utiliser les boutons et

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Ficier text
    Bonjour
    Vous pouvez essayer ceci

    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
    Dim FILE_NAME As String = "C:\Documents\toto.txt"
    Dim TextLine As String
     
    If System.IO.File.Exists( FILE_NAME ) = True Then
     
    Dim objReader As New System.IO.StreamReader(FILE_NAME)
     
    Do While objReader.Peek() <> -1
     
    TextLine = TextLine & objReader.ReadLine() & vbNewLine
     
    Loop
     
    Textbox1.Text = TextLine
     
    Else
     
    MsgBox("File Does Not Exist")
     
    End If
    Cela vous permet de naviguer dans le fichier

  3. #3
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    Bonjour,
    Je vous remercie pour votre réponse.
    Mais votre code ne permet pas de rechercher dans le fichier texte.

    Merci d'utiliser la code a l'aide du bouton # pour améliorer la compréhension du post.
    Merci de ainsi que d'utiliser les boutons et

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    C'est bien la boucle qui ne va pas... En passant au pas à pas, tu aurais vu qu'il y a un problème.

    explication : Tu utilises deux boucles imbriquées, la première utilise la variable "Ligne"... Or la deuxième boucle utilise aussi "Ligne"...
    La deuxième boucle, ne boucle sur rien d'ailleurs...

    Bref... y'a toujours 10 000 façons de faire... si on reste dans l'esprit (une seule boucle) :


    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
    Public Sub Lecture_donnees(ByVal Nom_fichier As String, ByVal  Indice_recherche_1 As String, ByVal Indice_recherche_2 As String, ByRef Valeur_trouvee as String)
     
         Dim Indice1Trouve as Boolean = False
         Dim Valeur_trouvee  as String = String.Empty
     
         For Each Ligne As String In System.IO.File.ReadLines(Nom_fichier)
     
               If Indice1Trouve = False Then
     
                      'Cas 1 : On rentre ici tant qu'on a pas trouvé le premier indice
     
                      If Ligne.Contains(Indice_recherche_1) Then
                               Indice1Trouve  = True 
                               'On peut commencer a récupérer les éléments
                               'On passe directement à la ligne suivante
                               Next 'Ignore toute la suite et passe à la ligne suivante
                      End If
     
               Else
     
                     'On a trouvé le premier indice
     
                      If Ligne.Contains(Indice_recherche_2) Then
     
                          'Cas 3 : Si on trouve l'indice, c'est finis
                          Exit For
     
                      Else
     
                           'Cas 2 : Sinon on enregistre
                           If Ligne.Contains("~") Then
                                 Valeur_trouvee = Valeur_trouvee & Ligne.Split("~")(0)
                           Else
                                  Valeur_trouvee = Valeur_trouvee & Ligne
                           End If
     
                      EndIf
              EndIf
     
         Next Ligne      
     
    End Sub
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Membre éprouvé

    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
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    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
     Private list1 As New List(Of String)
          private retrievevalues as new list(of string)
          private sub TEST
              Dim found As Boolean = False
             'on lit tout le fichier dans une list of string
             list1 = IO.File.ReadAllLines("le chemin du fichier", System.Text.Encoding.Default).ToList
             For iter = 0 To list1.Count - 1
                If list1(iter).Contains("0~120 1") Or found Then
                    found = True
                    If list1(iter + 1).Contains("4~120 3") Then
                        Exit For
                    End If
             'on ajoute les valeurs recherchées dans retrievevalues
                    retrievevalues.Add(list1(iter + 1))
                End If
            Next
      end sub

  6. #6
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    @mactwist69
    J’avais bien effectué de nombreux pas à pas durant mes divers essais.
    ce qui prouve qu'il me reste pas mal de travail en matière de programmation.

    J'ai modifié un peu ton 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        Public Sub Lecture_donnees(ByVal Nom_fichier As String, ByVal Indice_recherche_1 As String, ByVal Indice_recherche_2 As String)
     
            Dim Indice1Trouve As Boolean = False
            Valeurs_trouvee = String.Empty
     
            For Each Ligne As String In System.IO.File.ReadLines(Nom_fichier)
                If Indice1Trouve = False Then
                    'Cas 1 : On rentre ici tant qu'on a pas trouvé le premier indice
                    If Ligne.Contains(Indice_recherche_1) Then
                        Indice1Trouve = True
                        'On peut commencer a récupérer les éléments
                        'On passe directement à la ligne suivante
                        'Next 'Ignore toute la suite et passe à la ligne suivante
                    End If
                Else
                    'On a trouvé le premier indice
                    If Ligne.Contains(Indice_recherche_2) Then
                        'Cas 3 : Si on trouve l'indice, c'est finis
                        Exit For
                    Else
                        'Cas 2 : Sinon on enregistre
                        If Ligne.Contains("~") Then
                            If Valeurs_trouvee <> "" Then
                                Valeurs_trouvee = Valeurs_trouvee & "." & Ligne.Split("~")(0)
                            Else
                                Valeurs_trouvee = Ligne.Split("~")(0)
                            End If
                        Else
                            If Valeurs_trouvee <> "" Then
                                Valeurs_trouvee = Valeurs_trouvee & "." & Ligne
                            Else
                                Valeurs_trouvee = Ligne
                            End If
                        End If
                    End If
                End If
            Next Ligne
        End Sub
    Merci pour les tuyaux.
    Bonne journée
    Merci de ainsi que d'utiliser les boutons et

  7. #7
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Une autre méthode bien moins optimisé mais le principal se situe dans le raisonnement :

    But recherché :
    Nous souhaitons obtenir un texte situé entre 2 occurrences (non incluses) de mêmes nom (~120) en vue de le conserver depuis un fichier texte !

    Analyse :
    * Pour pouvoir conserver du texte entre 2 occurrences (la toute première et la toute dernière) il faut impérativement détecter sur quelles ligne elles se situent : FirstOccur et LastOccur pourraient nous indiquer leurs positions sur les lignes du fichier texte numéroté de 0 à n - 1 ou de 1 à n. Sans 2 positions identifiées = pas d'extraction !

    * Etant donné que l'on souhaite récupérer des numéros de lignes ainsi que les lignes associées alors on travaille avec un dictionnaire de données : Dictionary(Of Integer,String)

    * On utilise un StreamReader pour parcourir le fichier texte ligne par ligne, à chaque passage de ligne on incrémente une variable iCount qui nous indique la position de la ligne en cours afin de stocker dans le dictionnaire l'association clé/valeur : Key = iCount, Value = Line.
    Le dictionnaire est pourvu de toutes les lignes et leur numéro.

    * On utilise LINK et les fonctions anonymes pour récupérer l'index de la 1ère occurrence (minLine) et la dernière (maxLine) trouvée dans le fichier texte.

    * On ouvre un streamwriter et on parcours le dictionnaire pour écrire les lignes qui sont comprises entre la 1ère et la dernière occurrence trouvée préalablement. Enfin on écrit dans le fichier d'origine

    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
     
            Dim occur = "~120"
            Dim fPath = "C:\Users\jm\Desktop\test.txt"
            Dim lineCount%
            Dim originalLines = New Dictionary(Of Integer, String)
     
            Using sr = New StreamReader(fPath)
                Dim line = sr.ReadLine()
                While line IsNot Nothing
                    lineCount += 1
                    originalLines.Add(lineCount, line)
                    line = sr.ReadLine()
                End While
                sr.Close()
            End Using
     
            Dim FoundedOccur As Collections.Generic.IEnumerable(Of Collections.Generic.KeyValuePair(Of Integer, String)) = originalLines.ToList.Where(Function(i) i.Value.Contains(occur))
     
            Dim minLine% = FoundedOccur.Aggregate(Function(j, k) If(j.Key < k.Key, j, k)).Key
            Dim maxLine% = FoundedOccur.Aggregate(Function(j, k) If(j.Key > k.Key, j, k)).Key
     
            If minLine < maxLine Then
                Using sw As New StreamWriter(fPath)
                    For Each l In originalLines
                        If l.Key > minLine AndAlso l.Key < maxLine Then
                            sw.Write(l.Value & vbNewLine)
                        End If
                    Next
                    sw.Close()
                End Using
            End If


    MAIS ---> Dans un soucis de toujours vouloir réutiliser mon code je découperais le problème comme suit :

    La routine d'extraction de chaîne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Dim fPath = "C:\Users\jm\Desktop\test.txt"
            Dim AllText = IO.File.ReadAllText(fPath)
            Dim str = ParseBetween(AllText, "Valeur 0~120 1", "Valeur 4~120 3")
            If Not str(0) Is Nothing Then
                MsgBox(str(0))
            End If
    La fonction "ParseBetween" qui pourra être utilisé dans d'autres scénarios pour récupérer une chaîne contenu entre 2 occurrences :

    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
     
        Private Function ParseBetween(ByVal Source$, ByVal Before$, ByVal After$) As String()
            Dim Results As New List(Of String)
            Dim T As New List(Of String)
            With T
                'On découpe le texte en vue de récupérer la texte se situant après before (se référer à RegEx.Split pour connaitre l'avantage lié à cette méthode)
                .AddRange(Regex.Split(Source, Before))
                'On supprime tout ce qui se situe avant la chaîne Before
                .RemoveAt(0)
                ' On boucle pour supprimer tout ce qui se situe après la chaîne After (il peut exister plusieurs résultats donc stockage dans une List(of String)
                For Each Item$ In T
                    Results.Add(Regex.Split(Item, After)(0))
                Next
            End With
            Return Results.ToArray
        End Function



    Il existe plusieurs manière propre à chacun de résoudre un problème.

    Le secret : Se poser et raisonner avant de coder.

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

Discussions similaires

  1. Ecrire plusieurs lignes dans un fichier texte
    Par Ladoll dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 06/02/2013, 19h06
  2. Récupération de certaines lignes d'un fichier texte
    Par D_light dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 31/10/2012, 17h46
  3. Extraire plusieurs ligne d'un fichier texte
    Par stpaul04 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/08/2009, 19h41
  4. Ecrire plusieurs lignes dans un fichier texte
    Par kinon dans le forum ASP.NET
    Réponses: 5
    Dernier message: 05/02/2009, 16h07
  5. Réponses: 2
    Dernier message: 02/03/2004, 20h38

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