[V.B 2010 Express]Sauter une ligne avant une chaîne de caractère spécifique
-
mercredi 8 août 2012 10:36
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 NextLe 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
Toutes les réponses
-
mercredi 8 août 2012 13:49
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 Ifen 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 14:13
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:46
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:55Je 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:58
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 15:17
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 17:05
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:54
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

