Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[Résolu] - [VB Express 2005] Mise en forme de fichier texte


Messages recommandés

Posté(e) (modifié)

Bonjour,

 

Je viens de me créer un petit programme, que vous trouverez surement pas très utile mais je m'occupe comme je peut... :P

 

Je vais essayer de vous expliquer a quoi il sert :

 

En fait je cherche du travail pour cet été et j'ai copié la liste des entreprise proche de chez moi à partir de ce site.

 

J'ai copié ce tableau dans un fichier texte et le problème c'est que la mise en forme n'est vraiment pas pratique et j'ai donc fait ce petit programme qui met une entreprise par ligne dans un nouveau fichier, ce qui fait beaucoup plus classe.

 

Voici le code du programme :

Public Class Form1

   Dim tent() As String
   Dim ent As String
   Dim i As Integer
   Dim newent As String, strold As String


   Private Sub BtnChanger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnChanger.Click

       If TxtSource.Text = "" Then

           MessageBox.Show("Source non précisée !", "Erreur")

       Else

           If TxtCar.Text = "" Then

               MessageBox.Show("Indiquez un caratère de séparation !", "Erreur")

           Else

               If TxtDest.Text = "" Then

                   MessageBox.Show("Destination non précisée !", "Erreur")

               Else

                   FileOpen(1, TxtSource.Text, OpenMode.Input)
                   FileOpen(2, TxtDest.Text, OpenMode.Output)

                   While Not EOF(1)
                       i = 0
                       ent = LineInput(1)
                       newent = Replace(ent, Chr(9), "")
                       tent = Split(newent, TxtCar.Text)

                       For i = 0 To 2

                           PrintLine(2, LTrim(tent(i)))

                       Next

                   End While

                   FileClose(1)
                   FileClose(2)

                   Application.Exit()

               End If

           End If

       End If

   End Sub

   Private Sub BtnENr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnENr.Click

       OpenFileDialog1.Filter = "Fichiers textes | *.txt"
       OpenFileDialog1.ShowDialog()
       TxtSource.Text = OpenFileDialog1.FileName

   End Sub

   Private Sub BtnSauv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSauv.Click

       SaveFileDialog1.Filter = "Fichiers textes | *.txt"
       SaveFileDialog1.ShowDialog()
       TxtDest.Text = SaveFileDialog1.FileName

   End Sub

End Class

 

Et les objets :

vz3czt6i.jpg

 

Le probleme auquel je suis confronté est que le nombre de colonne est variable et donc le programme bug si par exemple la derniere ligne ne contient que 2 colonnes.

 

J'aimerai donc savoir s'il y aune possiblité de gerer cette erreur.

 

Si vous n'avez pas tout compris n'hesitez pas a poser d'autres questions mais je pense avoir été a peu pres clair.

 

Merci d'avance pour ceux qui perdront leur temps pour moi.

 

a+

Modifié par Raphdu01

  • Modérateurs
Posté(e)

Je n'ai pas détaillé ton source mais je ne comprends pas ton histoire de nombre de colonnes variable. Il est clair que tu souhaites réorganiser tes données, très probablement pour pouvoir les exploiter.

 

La démarche commence donc par la définition des diverses colonnes de ton tableau, car il est impératif d'avoir toujours la même nature de renseignement dans une même colonne. Sinon, il suffirait de faire des tabulations dans un fichier WORD...

 

Ensuite, ton programme de mise en forme est nettement compliqué par le fait que tu devras « reconnaître » chaque renseignement pour aller le caser dans la bonne colonne. Quand un renseignement est absent, la colonne correspondante reste vide. Normal.

 

Mais j'ignore si ceci t'a aidé :P

Posté(e)

Bonjour Dylav,

 

Je souhaite en effet réorganiser mes données, mais j'ai été confronté à une situation où la dernière ligne ne contenait qu'une seule donnée au lieu de trois dans les autres. Donc lors de l'écriture dans le fichier de destination (For i=0 to 2 / Printline...), lorsque j'ai une seule donnée le programme plante car tent(1) et tent(2) n'existent pas je ne peux donc pas les copier...

 

J'ai tenté de gérer l'erreur avec un if (if tent(i)="") mais ça ne marche pas et c'est un peu logique.

 

Mais à mon avis j'ai peu de chances de rencontrer des situations ou ce programme fonctionnera comme je voudrait (j'ai fait des essais sur d'autre données copiée dans un .txt), j'ai fait ça plus par amusement... Mais c'est pas si mal et ça me fait ch**r de pas pouvoir le faire jusqu'au bout..

 

Je ne pense pas avoir fait avancer mieux la machine mais je vois pas quoi faire de plus :P

 

Merci quand même

 

a+

  • Modérateurs
Posté(e)

Alors renverse ton problème et, au lieu d'une boucle fixe, utilise une boucle conditionnelle

 

i=0
While (tent(i))
 PrintLine(2, LTrim(tent(i)))
 i++
 Next

ou encore, si ça ne marche pas, quelque chose de moins « propre », tu commences par calculer la longueur de la table tent (je ne suis pas sûr de la syntaxe de la ligne imax=...) pour mettre en œuvre une boucle variable

 

tent = Split(newent, TxtCar.Text)
imax = length(tent) - 1
For i = 0 To imax
 PrintLine(2, LTrim(tent(i)))
 Next

Posté(e)

Bonjour Dylav

 

Première solution :

38uo0bnl.jpg

 

Deuxième solution :

lglwbufs.jpg

 

Tu a exactement compris ce que j'essayai de faire mais j'ai des doutes sur l'existence d'une solution, a mon niveau en tout cas.

 

Malgré le bug final en général le fichier créé correspond a ce que je veux.

 

J'aurai essayé...

 

ps : lenght -> len en VB.

 

Merci pour ton aide

 

a+

  • Modérateurs
Posté(e)

Désolé, tu sembles encore avoir des problèmes, mais d'ici -au taf- je ne peux pas voir tes images (hébergées par HibOOx, site bloqué par le proxy de mon réseau). Je jetterai un œil ce soir :P

  • Modérateurs
Posté(e)

Bonsoir Raphdu01,

 

Je ne suis pas trop étonné que ma 1ère solution ne fonctionne pas. Je m'étais trop habitué à un langage très permissif (PERL, pour ne pas le nommer), qui sait convertir implicitement une variable dans le type nécessaire à l'opération qu'on veut lui faire subir (c'est pratique, mais ça peut s'avérer vicieux, dans certains cas). Dans notre cas, je voulais temporairement faire de tent(i) un booléen...

 

Pour la seconde solution, je ne saisis pas bien l'anomalie. Il semblerait que Len(tent) ne définisse pas, comme je le pensais, le nombre de postes de la table tent. N'existe-t-il pas une fonction qui remplisse ce rôle ?

 

Mais je voudrais revenir à la solution que tu tentais de mettre en œuvre.

 

J'ai tenté de gérer l'erreur avec un if (if tent(i)="") mais ça ne marche pas et c'est un peu logique.

Dans la mesure où tent(i) n'est pas un nombre, mais une chaîne de caractères, ne devrait-on pas écrire le test sous la forme (if tent(i) eq "") ?

Posté(e) (modifié)

Salut Dylav

 

Pour ta première solution, il n'y a pas un moyen de déclarer d'une façon neutre la variable qui m'intéresse ? Comme ça une fois elle est en string et quand ça nous arrange elle est en boolean..Il me semblait que le type object faisait ça mais j'ai essayé en vain.

 

Ensuite, la solution avec eq ne marche pas, apparemment car le eq n'est pas reconnu. J'ai cherché quelque chose qui pourrait correspondre mais je n'ai pas trouvé :P

Et de toute façon tent(i) ne peut pas être vide s'il n'existe pas !

 

Pour la longueur j'ai trouvé ce bout de code :

 

longueur = Ubound(Tableau) - LBound(Tableau) + 1

 

Et la tu a le nombre exact d'éléments de ton tableau quelque soit les bornes min et max

 

Reste à voir si ça marche...

Modifié par Raphdu01
Posté(e)

Re

 

Bon je crois qu'on y est ! :P

 

Cette fois pas de bug donc la longueur est gérée... Seul petit hic : ça me saute une ligne dans le fichier à chaque fois que je change de ligne dans le tableau :P

 

Mais ce n'est qu'un détail mainteant...

 

Je regarde ça et je te tiens au courant, ensuite je commercialise, je te laisse 10 % ok ? :P

 

A + tard

Posté(e)

Public Class Form1

   Dim tent() As String
   Dim ent As String
   Dim i As Integer, imax As Integer
   Dim newent As String


   Private Sub BtnChanger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnChanger.Click




       If TxtSource.Text = "" Then

           MessageBox.Show("Source non précisée !", "Erreur")

       Else

           If TxtCar.Text = "" Then

               MessageBox.Show("Indiquez un caratère de séparation !", "Erreur")

           Else

               If TxtDest.Text = "" Then

                   MessageBox.Show("Destination non précisée !", "Erreur")

               Else

                   FileOpen(1, TxtSource.Text, OpenMode.Input)
                   FileOpen(2, TxtDest.Text, OpenMode.Output)

                   While Not EOF(1)

                       ent = LineInput(1)
                       newent = Replace(ent, Chr(9), "")

                       tent = Split(newent, TxtCar.Text)

                       imax = UBound(tent) - LBound(tent) + 1

                       For i = 0 To imax - 2

                           PrintLine(2, LTrim(tent(i)))

                       Next


                   End While

                   FileClose(1)
                   FileClose(2)

                   Application.Exit()

               End If

           End If

       End If

   End Sub

   Private Sub BtnENr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnENr.Click

       OpenFileDialog1.Filter = "Fichiers texte (*.txt) | *.txt"
       OpenFileDialog1.ShowDialog()
       TxtSource.Text = OpenFileDialog1.FileName

   End Sub

   Private Sub BtnSauv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSauv.Click

       SaveFileDialog1.Filter = "Fichiers texte (*.txt) | *.txt"
       SaveFileDialog1.ShowDialog()
       TxtDest.Text = SaveFileDialog1.FileName

   End Sub

End Class

 

Comment dire ? Heu... Parfait ! Oui ça correspond parfaitement ^^

 

Bon ben cette fois c'est la bonne enfin... ça fait plaisir..!!

 

Merci beaucoup Dylav pour ton aide.

 

A+

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...