none
[V.B 2010 Express]Sauter une ligne avant une chaîne de caractère spécifique RRS feed

  • Question

  • Bonjour,

    J'ai un fichier texte que je souhaite réorganiser proprement et qui contient plusieurs paragraphes différents, sachant qu'en fonction des utilisateurs les différents paragraphes présentes ou non des saut à la lignes entre eux. Or, j'ai besoin que tout les paragraphes soient séparer par des sauts à la ligne. Donc, la première chose que je fait c'est d'enlever tout les sauts à la ligne du texte puis ce que je cherche à faire maintenant c'est rajouter des sauts à la ligne avant chaque paragraphe commençant par [Area.X], où X prend la valeur de chaque paragraphe (ex : 1er paragraphe - [Area.001] - 270ème paragraphe - [Area.270] et ainsi de suite). Pour ne pas m'embêter à réécrire la valeur X à chaque paragraphe, j'ai contourner le problème en spécifiant que la ligne commence par "[Area." et qu'elle fini "]" et sa fonctionne très bien.

    Voici donc mon code actuel (Visual Basic 2010 Express) :

            LignesFichierConfigurationAddon = System.IO.File.ReadAllLines("C:\Users\Maison\Desktop\test.cfg")
    
                My.Computer.FileSystem.WriteAllText("C:\Users\Maison\Desktop\test.cfg", System.String.Empty, False)
    
                For Each Ligne As String In LignesFichierConfigurationAddon
    
                    If Ligne.Length > 1 Then
                        My.Computer.FileSystem.WriteAllText("C:\Users\Maison\Desktop\test.cfg", Ligne & vbNewLine, True)
                    End If
    
                    If Ligne.StartsWith("Clean_on_Exit=") Then
                        My.Computer.FileSystem.WriteAllText("C:\Users\Maison\Desktop\test.cfg", vbNewLine, True)
                    End If
    
                If Ligne.StartsWith("[Area.") And Ligne.EndsWith("]") Then
                    My.Computer.FileSystem.WriteAllText("C:\Users\Maison\Desktop\test.cfg", vbNewLine, True)
                End If
                Next

    Le code fait exactement ce que je souhaite à une exception près, il ajoute le saut de ligne après [Area.X] or ce que je souhaite c'est l'ajouter avant cette ligne et non après. Il y a autre chose que je n'arrive pas à régler c'est enlever les sauts de lignes si ils en existe à la fin du texte, en gros lui dire si le texte finit par un saut de ligne alors supprimer le(s) saut(s) de ligne(s), de manière à ce que la dernière ligne soit du texte et non un ou des saut(s) de ligne(s).

    Merci d'avance de votre aide

    Cordialement




    • Modifié Pilotepro mercredi 8 août 2012 11:24
    mercredi 8 août 2012 10:36

Réponses

  • Bonjour PilotePro,

    Peut-être mettre :

     If Ligne.StartsWith("[Area.") And Ligne.EndsWith("]") Then
         My.Computer.FileSystem.WriteAllText("C:\Users\Maison\Desktop\test.cfg", vbNewLine, True)
     End If

    en début de boucle, juste après le 'For'. Actuellement tu réécris la ligne avant de tester son contenu.


    Cordialement, Jacques

    • Marqué comme réponse Pilotepro mercredi 8 août 2012 15:57
    mercredi 8 août 2012 13:49
  • Bonjour,

    A ta place, je ne ferais pas de traitement séquentiel des lignes du fichier.

    Je ferais une suppression globale des "new line", puis un ajout de "new line" devant chaque "[Area"

     Dim LeTexte as String = System.IO.File.ReadAllLines("C:\Users\Maison\Desktop\test.cfg")
    LeTexte=leTexte.Replace(vbnewline,"")
    leTexte = leTexte.Replace("[Area",vbnewline & "[Area")

    • Marqué comme réponse Pilotepro mercredi 8 août 2012 15:57
    mercredi 8 août 2012 14:58
  • Tu peux "jouer" sur deux tableaux : celui qui est lu, et un que tu va renseigner avant de le réécrire dans le fichier. Problème : Tu connais la dimension du tableau lu, c'est le nombre de lignes, mais tu ne sais pas combien il y a de lignes vides à supprimer, ni combien tu vas en ajouter avant les [Area.X]

    Tu peux essayer ceci :

            Dim LeTexte() As String = System.IO.File.ReadAllLines("C:\test.cfg")
            Dim LeNouveauTexte() As String
            Dim i As Integer, LastLigne As Integer
    
            ' Recherche de la dernière ligne non vide
            i = LeTexte.Length - 1
            While LeTexte(i).Length = 0
                i = i - 1
            End While
            LastLigne = i
    
            ReDim LeNouveauTexte(LastLigne)
            For i = 0 To LastLigne
                ' Pas de NewLine si première ligne
                If i > 0 Then
                    LeNouveauTexte(i) = LeTexte(i).Replace("[Area", vbNewLine & "[Area")
                Else
                    LeNouveauTexte(i) = LeTexte(i)
                End If
            Next
            System.IO.File.WriteAllLines("C:\Test.cfg", LeNouveauTexte)


    Cordialement, Jacques

    • Marqué comme réponse Pilotepro mercredi 8 août 2012 17:53
    mercredi 8 août 2012 17:05

Toutes les réponses

  • Bonjour PilotePro,

    Peut-être mettre :

     If Ligne.StartsWith("[Area.") And Ligne.EndsWith("]") Then
         My.Computer.FileSystem.WriteAllText("C:\Users\Maison\Desktop\test.cfg", vbNewLine, True)
     End If

    en début de boucle, juste après le 'For'. Actuellement tu réécris la ligne avant de tester son contenu.


    Cordialement, Jacques

    • Marqué comme réponse Pilotepro mercredi 8 août 2012 15:57
    mercredi 8 août 2012 13:49
  • Bonjour,

    Tout d'abord je tient à vous remercier d'avoir répondu, quand à votre suggestion cela ne changera rien qu'elle soit au début ou à la fin car Ligne représente comme son nom l'indique la ligne qui est lu dans la boucle, ainsi grâce la condition je repère la ligne qui m'intéresse à savoir [Area.X], puis à cette ligne j'ajoute un saut à la ligne. Or, j'ai besoin d'ajouter le saut à la ligne à la ligne qui se trouve juste avant celle-ci, mais vu que le contenu de la ligne juste avant est variable et qu'elle ne commence pas toujours de la même manière il m'est impossible de la définir précisément dans la condition. C'est pour cela qu'il faudrait qu'avant l'instruction d'écrire un saut à la ligne je puisse lui indiquer que c'est à une ligne au dessus qu'il faut l'écrire.

    Cordialement


    • Modifié Pilotepro mercredi 8 août 2012 14:15
    mercredi 8 août 2012 14:13
  • Fais au moins le test. L'écriture étant séquentielle, tu ne peux pas demander d'écrire à la ligne d'avant.

    Fichier de départ :

    [Area.1]
    ligne1
    [Area.2]
    ligne2
    [Area.3]
    ligne3
    [Area.4]
    ligne4
    [Area.4]
    ligne4
    [Area.5]
    ligne5
    

    Résultat obtenu avec ton code :

    [Area.1]
    
    ligne1
    [Area.2]
    
    ligne2
    [Area.3]
    
    ligne3
    [Area.4]
    
    ligne4
    [Area.4]
    
    ligne4
    [Area.5]
    
    ligne5
    

    Résultat obtenu en déplaçant le test en début de boucle

    [Area.1]
    ligne1
    
    [Area.2]
    ligne2
    
    [Area.3]
    ligne3
    
    [Area.4]
    ligne4
    
    [Area.4]
    ligne4
    
    [Area.5]
    ligne5
    

    :


    Cordialement, Jacques

    mercredi 8 août 2012 14:46
  • Je tient infiniment à vous remercier vous avez vu totalement juste, mon problème est à moitié résolu il ne me reste plus qu'une chose à faire c'est réussir à enlever la ou les dernière(s) ligne(s) si elle est ou vide(s) autrement dit si elle ne contient pas de texte de manière à ce que la dernière ligne contienne bien du texte.

    Merci encore pour votre j'espère qu'une personne pourra m'aider à résoudre la seconde partie de mon problème.

    Cordialement
    mercredi 8 août 2012 14:55
  • Bonjour,

    A ta place, je ne ferais pas de traitement séquentiel des lignes du fichier.

    Je ferais une suppression globale des "new line", puis un ajout de "new line" devant chaque "[Area"

     Dim LeTexte as String = System.IO.File.ReadAllLines("C:\Users\Maison\Desktop\test.cfg")
    LeTexte=leTexte.Replace(vbnewline,"")
    leTexte = leTexte.Replace("[Area",vbnewline & "[Area")

    • Marqué comme réponse Pilotepro mercredi 8 août 2012 15:57
    mercredi 8 août 2012 14:58
  • Sygrien, c'est une excellente idée merci sa va me permettre de réduire tout le code, le seul problème c'est que votre code me donne l'erreur suivante sur VB :

    Impossible de convertir une valeur de type 'Tableau à 1 dimension(s) de String' en 'String'.

    Le problème c'est que si je met la variable LeTexte en tableau comme ceci : "Dim LeTexte() As String", les deux lignes suivantes retournent l'erreur :

    Replace' n'est pas un membre de 'System.Array'.

    Alors, que faire sans passer par un traitement séquentiel des lignes du fichier, pour que sa marche. Je tient par ailleurs à vous annoncer que j'ai résolu la seconde partie du problème ne me reste que cette petite erreur à corriger et tout sera parfait.

    Merci d'avance à toutes et à tous

    Cordialement

    mercredi 8 août 2012 15:17
  • Tu peux "jouer" sur deux tableaux : celui qui est lu, et un que tu va renseigner avant de le réécrire dans le fichier. Problème : Tu connais la dimension du tableau lu, c'est le nombre de lignes, mais tu ne sais pas combien il y a de lignes vides à supprimer, ni combien tu vas en ajouter avant les [Area.X]

    Tu peux essayer ceci :

            Dim LeTexte() As String = System.IO.File.ReadAllLines("C:\test.cfg")
            Dim LeNouveauTexte() As String
            Dim i As Integer, LastLigne As Integer
    
            ' Recherche de la dernière ligne non vide
            i = LeTexte.Length - 1
            While LeTexte(i).Length = 0
                i = i - 1
            End While
            LastLigne = i
    
            ReDim LeNouveauTexte(LastLigne)
            For i = 0 To LastLigne
                ' Pas de NewLine si première ligne
                If i > 0 Then
                    LeNouveauTexte(i) = LeTexte(i).Replace("[Area", vbNewLine & "[Area")
                Else
                    LeNouveauTexte(i) = LeTexte(i)
                End If
            Next
            System.IO.File.WriteAllLines("C:\Test.cfg", LeNouveauTexte)


    Cordialement, Jacques

    • Marqué comme réponse Pilotepro mercredi 8 août 2012 17:53
    mercredi 8 août 2012 17:05
  • Le sujet est enfin totalement résolu je vous remercie tous et plus particulièrement vous Jacques93 pour votre aide.

    Bonne fin d'après-midi

    Cordialement

    mercredi 8 août 2012 17:54