none
GESTION DE FICHIERS TEXTE AVEC LES OBJETS

    Discussion générale

  • GESTION DE FICHIERS TEXTE AVEC LES OBJETS

    Le fichier texte est à mon sens le roi des fichiers côté "client". Un des plus vieux fichiers, il a plus d'un tiers de siècle, il a le mérite d'être simple, compréhensible à l'oeil directement et pouvant être lu par à peu près tout ce qui existe comme applications. Il peut de plus être seul ou indexé par un second fichier texte par exemple qui servirait de table des matières. Il n'est pas plus lent qu'une base de donnés, mais encore, il présente l'avantage d'être totalement indépendant, à contrario d'une base de données qui pose souvent des problèmes de compatibilité de version, d'OS ou de DLL au bout d'un certain temps.

    Le fichier de type texte est entendu lato sensu (txt, html, csv)... N'est présenté ici que la gestion d'un fichier unique à laide des objets (qui jouent le rôle de variables visibles à l'oeil nu), c'est la façon la plus simple, mais on peut aussi le gérer directement avec le code, ce qui peut faire une suite à ce présent texte. Dans ce cas la gestion est un peu plus délicate car aveugle dans des variables, mais ça permet davantage d'opération, comme la gestion à l'octet avec le pointeur, et aussi une vitesse accrue...

    Pour utiliser ces exemples qui fonctionnent, le mieux est de créer un nouveau programme, d'y coller le code et d'y mettre scrupuleusement tous les objets indiqués, ensuite tout va fonctionner simplement car l'ensemble sera dimensionné et incrémenté par le code, voici :

    '
    ' Gestion d'un fichier texte à l'aide des objets
    '
    Option Explicit On ' exemple de gestion d'un fichier texte
    Public Class Form1
     Dim fichier As String = CStr(My.Application.Info.DirectoryPath) & "\test_fic.txt"
     Dim ligneRajout As String
     '
     ' ------
     ' OBJETS
     ' ------
     ' Form1
     ' ListBox1 (mettre police fixe, par exp "Courier New" (un seul "R") + laisser "sorted" à "false"
     ' ListBox2 (idem à listbox1)
     ' combobox1
     '
     '
     Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Dim i As Integer = 5 ' création fictives de 5 ensemble comportant 3 sous-ensemble
      Dim nom(i) As String
      Dim salaire(i) As String
      Dim couleurVoiture(i) As String
      Dim esp As Byte = 0
      Dim ligne As String
      '
      Me.Left = 25
      Me.Top = 25
      Me.Width = 830
      Me.Height = 500
      ListBox1.Left = 12
      ListBox1.Top = 12
      ListBox1.Width = 390
      ListBox1.Height = 345
      ListBox1.Sorted = False
      ListBox1.Font = New System.Drawing.Font("Courier New", 12)
      ListBox2.Left = 410
      ListBox2.Top = 12
      ListBox2.Width = 390
      ListBox2.Height = 345
      ListBox2.Sorted = False
      ListBox2.Font = New System.Drawing.Font("Courier New", 12)
      ComboBox1.Left = 204
      ComboBox1.Top = 364
      ComboBox1.Width = 525
      ComboBox1.Height = 21
      ComboBox1.Font = New System.Drawing.Font("Courier New", 12)
      ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
      ComboBox1.Items.Add("Ecrit liste")
      ComboBox1.Items.Add("Supprime fichier")
      ComboBox1.Items.Add("Supprime 3e ligne + enregistre")
      ComboBox1.Items.Add("Rajoute une ligne")
      ComboBox1.Items.Add("Rajoute en fin de ligne")
      ComboBox1.Items.Add("REGENERE")
      ComboBox1.Items.Add("Rajoute en milieu de ligne")
      ComboBox1.Items.Add("Imprime papier")
      ComboBox1.Items.Add("Coder/Décoder un texte")
      ComboBox1.SelectedIndex = 0
      '
      'Dupont........ salaire. couleurV
      'Durand........ salaire. couleurV
      'Saint martin.. salaire. couleurV
      'Leroux........ salaire. couleurV
      'Lemoine....... salaire. couleurV
      '
      i = 1 ' chargement des variables (normalement saisies) pour démonstrations
      nom(i) = "Dupont"
      salaire(i) = "400,12"
      couleurVoiture(i) = "rouge"
      i = i + 1
      nom(i) = "Durand"
      salaire(i) = "1000,45"
      couleurVoiture(i) = "verte"
      i = i + 1
      nom(i) = "Saint martin"
      salaire(i) = "2000,90"
      couleurVoiture(i) = "bleue"
      i = i + 1
      nom(i) = "Leroux"
      salaire(i) = "4000,01"
      couleurVoiture(i) = "jaune"
      i = i + 1
      nom(i) = "Lemoine"
      salaire(i) = "8000,00"
      couleurVoiture(i) = "grise"
    
      ' formatage des datas : 16 + 8 + 8 = 32 octets + 2 espaces (+) = ligne de 34 octets
      ' format pr exp : (nom = 16, salaire 8, couleurVoiture 8)
      ' le formatage et la vérification se font généralement au moment de la validation de la saisie
      ' on doit avant vérifier la conformité de la saisie, ce qui n'est pas ici le sujet
      For i = 1 To 5 ' le nom
       nom(i) = Mid(nom(i), 1, 16) ' coupe à 16 octets
       nom(i) = Trim(nom(i)) ' retasse
       esp = 16 - Len(nom(i)) ' espace 16 octets
       nom(i) = nom(i) & Space(esp) ' cale à gauche sur 16 octets
      Next i
      For i = 1 To 5 ' le salaire
       salaire(i) = Mid(salaire(i), 1, 8) ' coupe à 8 octets
       salaire(i) = Trim(salaire(i)) ' retasse
       esp = 8 - Len(salaire(i)) ' espace 8 octets
       salaire(i) = Space(esp) & salaire(i) ' cale à droite sur 8 octets
      Next i
      For i = 1 To 5 ' la couleur de la voiture
       couleurVoiture(i) = Mid(couleurVoiture(i), 1, 8) ' coupe à 8 octets
       couleurVoiture(i) = Trim(couleurVoiture(i)) ' retasse
       esp = 8 - Len(couleurVoiture(i))
       couleurVoiture(i) = couleurVoiture(i) & Space(esp) ' cale à gauche sur 8 octets
      Next i
      '
      ' vérification de l'existance du fichier, et création si absence
      ' le fichier texte est par défaut dans c:\...répertoire_actuel\bin\debug
      ' on teste si le fichier existe
      ' il semble préférable de créer si besoin le fichier à ce stade où rien n'est affiché
      ' ainsi, le créant en début, ensuite on pourra l'utiliser en étant certain qu'il existe
      '
      If System.IO.File.Exists(fichier) = True Then
       Call litFichier() ' le fichier existe, on le lit puis par exp on le charge dans listbox1
      Else
       ' le fichier n'existe pas = création + chargement (ici pour exp)
       Dim p As New System.IO.StreamWriter(fichier) ' liaison pointeur P avec fichier
       For i = 1 To 5
        ligne = nom(i) & " " & salaire(i) & " " & couleurVoiture(i)
        p.WriteLine(ligne) ' écriture à la suite ligne se terminant par <cr> (ascii 12+10)
       Next i
       p.Close() ' fermeture du fichier 
       Call litFichier()
      End If
     End Sub
    
    
     Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
      Select Case ComboBox1.SelectedIndex
       Case 0 : Call ecritFichier()
       Case 1 : Call supprimeFichier()
       Case 2 : Call supprimeLigne()
       Case 3 : Call rajouteLigneEnFin()
       Case 4 : Call rajouteEnFinDeLigne()
       Case 5 : Call regenereFichier()
       Case 6 : Call rajourEnMilieuDeLigne()
       Case 7 : Call imprimer()
       Case 8 : Call coderDecoder()
      End Select
     End Sub
    
    
     Sub regenereFichier()
      ListBox1.Items.Clear() ' régénère la list1 d'exemple
      ListBox1.Items.Add("Dupont       400,12 rouge  ")
      ListBox1.Items.Add("Durand      1000,45 verte  ")
      ListBox1.Items.Add("Saint martin   2000,90 bleue  ")
      ListBox1.Items.Add("Leroux      4000,01 jaune  ")
      ListBox1.Items.Add("Lemoine      8000,00 grise  ")
      Call ecritFichier()
     End Sub
    
    
     Sub litFichier()
      ListBox1.Items.Clear()
      If System.IO.File.Exists(fichier) = False Then Exit Sub
      If FileLen(fichier) < 1 Then Exit Sub ' si le fichier est vide on sort
      Dim ligne As String
      Dim p As New System.IO.StreamReader(fichier)
      While p.Peek() >= 0 ' avance tant que le pointeur P est > ou = à 0
       ligne = p.ReadLine() ' lecture par ligne terminée par <cr>
       ListBox1.Items.Add(ligne)
      End While
      p.Close()
     End Sub
    
    
     Sub ecritFichier()
      Dim i As Long
      If ListBox1.Items.Count < 1 Then Exit Sub ' liste vide, sort ...
      Dim p As New System.IO.StreamWriter(fichier)
      For i = 0 To ListBox1.Items.Count - 1
       p.WriteLine(ListBox1.Items(i)) ' on peut écrire ou lire directement avec l'objet
      Next i
      p.Close()
     End Sub
    
    
     Sub supprimeFichier()
      Dim t As String = "Gestion du ficher" ' suppression du fichier
      Dim m As String = "Supprimer le fichier "
      Dim y As String
      y = MessageBox.Show(m, t, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
      If y <> vbYes Then Exit Sub
      Kill(fichier)
      Call litFichier()
     End Sub
    
    
     Sub supprimeLigne()
      If ListBox1.Items.Count < 3 Then Exit Sub
      ListBox1.Items.RemoveAt(3 - 1) ' supprimer la 3eme ligne / 5
      ListBox1.Refresh()
      Call ecritFichier()
     End Sub
    
    
     Sub rajouteLigneEnFin()
      Dim nom As String = "Nom rajouté   " ' rajouter une ligne ... en fin
      Dim salaire As String = " 1234,56"
      Dim couleurVoiture As String = "ciel  "
      ligneRajout = nom & " " & salaire & " " & couleurVoiture
      Call rajoutFichier()
      Call litFichier()
     End Sub
    
    
     Sub rajouteEnFinDeLigne()
      If ListBox1.Items.Count < 3 Then Exit Sub
      ' LE RAJOUT EN FIN D'UNE LIGNE
      ' rajout en fin de la seconde ligne (veiller à ce que la liste possède 3 lignes au moins)
      ' Pour cete opération on va utiliser deux listes (mais il y a d'autre méthodes)
      ' la liste1 va conserver ce qui est avant la ligne à modifier (2e)
      ' la liste2 va récupérer ce qui est après la ligne modifiée (2e)
      ' puis on va enlever de la list1 la ligne (2) à modifier
      ' on modifie la ligne 2 au niveau variables dans le code, puis :
      ' on remet la line modifiée à la list1 à laquelle on ajoute ensuite la list2
      ' enfin on inject dans le fichier en écrasement création la list1
      '
      Dim rajoutEnFin As String = " ©" ' à rajouter en fin de la ligne 2
      Dim i As Long
      ListBox2.Items.Clear()
      For i = 2 To ListBox1.Items.Count - 1 ' on met en list2 ce qui est après la ligne à modifier de la list1
       ListBox2.Items.Add(ListBox1.Items(i))
      Next i ' la list1 conserve tout jusqu'à la ligne à modifier incluse
      For i = ListBox1.Items.Count - 1 To 2 Step -1 ' stop juste avant ligne à modifier
       ListBox1.Items.RemoveAt(i) ' on efface list1 ce qui passe en list2
      Next i ' la list1 conserve tout jusqu'à la ligne à modifier incluse
      ligneRajout = ListBox1.Items(1) ' 2eme ligne (devenue dernière) en partant de 0, copié dans la variable
      ListBox1.Items.RemoveAt(1) ' on enlève de la list1 la ligne a modifier qui est copiée en variable
      ListBox1.Refresh()
      ligneRajout = ligneRajout & rajoutEnFin ' on rajoute l'élement à la ligne à modifier
      ListBox1.Items.Add(ligneRajout) ' on remet à sa place la ligne modifiée en list1
      For i = 0 To ListBox2.Items.Count - 1
       ListBox1.Items.Add(ListBox2.Items(i)) ' on met en fin de list1 le contenu de list2
      Next i
      Call ecritFichier() ' on écrit toute la liste1 dans le fichier par écrasement
     End Sub
    
    
     Sub rajourEnMilieuDeLigne()
      If ListBox1.Items.Count < 3 Then Exit Sub
      ' voir la méthode de la procédure : "rajouteEnFinDeLigne()"
      Dim m As String ' à rajouter en fin de la ligne 2
      Dim r As String = "@" ' rajout
      Dim i As Long
      Dim un As String
      Dim deux As String
      ListBox2.Items.Clear()
      For i = 2 To ListBox1.Items.Count - 1
       ListBox2.Items.Add(ListBox1.Items(i))
      Next i
      For i = ListBox1.Items.Count - 1 To 2 Step -1
       ListBox1.Items.RemoveAt(i)
      Next i
      m = ListBox1.Items(1)
      ListBox1.Items.RemoveAt(1)
      ListBox1.Refresh()
      un = Mid(m, 1, 26) ' on scinde en deux, avant et après l'insertion
      deux = Mid(m, 27, 8)
      m = un & r & deux ' on insère et on réuni de nouveau
      ListBox1.Items.Add(m)
      For i = 0 To ListBox2.Items.Count - 1
       ListBox1.Items.Add(ListBox2.Items(i))
      Next i
      Call ecritFichier()
     End Sub
    
    
     Sub rajoutFichier() ' 2 écriture (création et rajout) ... voir ci-dessus
      Dim p As New System.IO.StreamWriter(fichier, True) ' TRUE = créer et si existe = AJOUT
      p.WriteLine(ligneRajout)
      p.Close()
     End Sub
    
    
     Sub coderDecoder()
      Dim ligne As String
      Dim mot As String = "monMotDePasse"
      Dim ascii As Integer
      Dim saut As String = vbLf
      Dim octet As Char
      Dim alternat As Double
      Dim code As String
      '
      ligne = "MOT A CODER" & saut & saut & mot & saut & saut
      alternat = -1 ' codage
      code = ""
      For i = 1 To Len(mot)
       ascii = Asc(Mid(mot, i, 1))
       octet = Chr(ascii + alternat)
       code = code & octet
       alternat = alternat * -1
      Next i
      ligne = ligne & saut & "MOT CODE" & saut & saut & code & saut & saut & saut & "MOT DECODE" & saut & saut
      alternat = 1
      mot = ""
      For i = 1 To Len(code) ' décodage
       ascii = Asc(Mid(code, i, 1))
       octet = Chr(ascii + alternat)
       mot = mot & octet
       alternat = alternat * -1
      Next i
      ligne = ligne & mot & saut
      MsgBox(ligne, MsgBoxStyle.Information)
     End Sub
    
    
     Sub imprimer()
      PrintDocument1.Print()
     End Sub
    
    
     Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
      Dim i As Integer
      Dim ligne As String = ""
      If ListBox1.Items.Count < 1 Then Exit Sub
      For i = 0 To ListBox1.Items.Count - 1
       ligne = ligne & ListBox1.Items(i) & vbCrLf
      Next i
      e.Graphics.DrawString(ligne, New Font("Courier New", 12, FontStyle.Bold), Brushes.Black, 150, 125)
     End Sub
    
    
     Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      End
     End Sub
    End Class
    '
    


    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    samedi 8 janvier 2011 13:19

Toutes les réponses

  • Bonjour Joe

    Bien que ne posant plus de question actuellement je consulte régulièrement le forum

    Ton article actuel me parait très pertinent car dans les modules que je développe je fait souvent appelle aux fichiers texte

    A travers tous tes conseils j'ai amélioré ma façon de programer

    Tu m'as fait remarquer que le Private n'était pas utile dans les private sub, de même j'ai constaté que le (ByVall sender As System.Object, ByVal e As System.EventArgs)

    qui est généré par un double Click sur un contrôle n'est pas non plus indispensable, les () suffisent, ce qui peut alléger considérablement le code des gros programmes.

    Cordialement

    Michel 


    PARIS Michel
    samedi 12 février 2011 12:26
  • Bonjour Michel,

    Merci, un compliment "venant de toi" m'honore :o)

    Oui pour les procédures mais je ne voulais pas troubler quelqu'un qui commencerait et n'aurait pas des procédures assez conformes à celles des ses objets, il ne comprendrait pas pourquoi ...

    En fait j'ai fait ceci à la demande et pour une personne afin qu'elle sâche manipuler les fichirs texte. Alors j'ai pris au plus simple avec les objets (à défaut de le faire avec des variables), et j'ai placé les cas les plus répandus d'utilisation de ces fichiers, puis ma foi, comme ça faisait quelque chose d'exploitable je l'ai déposé là. Il me reste à faire la gestion amélioré des fichiers texte (séquentiel indexé (index + data = 2 fichiers, ou plus en multi-crotères), la gestion du pointeur pour lire ou changer un morceau en plein milieu, voir changer une ligne si elle sont formatée, la création d'un csv, la gestion de la fin de ligne (chr(10) ou pas (ficier d'une ligne)), et les blocage en accès de l'enregistrement ou du fichier aini que les procédure de reprise de sauvegarde lors d'un plantage sur une suppression par exemple ...

    In fine, comme précisé dans le poste, le fichier texte lato sensu est le roi des fichier, il peut tout faire aussi bien que n'importe quoi, pour ceux qui aiment programmer évidemment, qui aiment le code (le binaire se gérant de façon quasi similaire), avec ces deux fichier on peut "tout" faire, sauf sur le Net où il faut une BDD pour des raisons de sécurité (à moins d'avoir son propre serveur), en plus le texte est la seule garantie que ça tournera, car avec les BDD y a trop de plantage à cause des versions, des MAJ, ce n'est pas assez fiable pour un logiciel (on le voit dans le nombre de questions), par contre pour une entreprise c'est bien et ça donne du boulot à l'informaticien, comme quoi  ... tout dépend.

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 14 février 2011 11:14