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 :

Modification de lignes dans un fichier séquentiel.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 323
    Par défaut Modification de lignes dans un fichier séquentiel.
    Bonjour

    Votre avis m'intéresse.
    Exemple : Soit un fichier (séquentiel) de 100 feuilles (de 1 à DerNum) contenant chacune 25 lignes (texte au km) de renseignements. Donc 2500 lignes. Je dois modifier par exemple certaines lignes de la page 10 (NumeroProb ) soit de la ligne 226 à 250.

    Opération en 4 phases :

    1/ Le programme lit et enregistre les feuilles de 1 à 9 dans un fichier tampon;
    2/ Le programme récupère les datas corrigés de la feuille 10 et les enregistre à la suite sur le fichier tampon;
    3/ Le programme lit et enregistre les feuilles 11 à 100 à la fin du fichier tampon;
    4/ Le contenu du fichier tampon remplace le contenu du fichier source.

    Le programme exemple fonctionne parfaitement. Il sert à modifier dans un fichier séquentiel certaines lignes. Opération en quatre phases en enregistrant les datas sur un fichier tampon (amendement.txt) puis remplacer le contenu du fichier source par le fichier tampon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit On
    Imports System.IO
    Imports System.Text
    Imports System.Threading
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    Sub ValidCorrectionProbleme()
     
            'Fonction : Modifier dans un fichier séquentiel certaines lignes. Opération en quatre phases en enregistrant les datas sur 
            'un fichier tampon (amendement.ech) puis remplacer le contenu du fichier source par le fichier tampon.
     
            'Phase 1 : Lecture et enregistrement dans le tampon des problèmes de 1 à NumeroProb -1 
     
            Try
                ' Création d'une instance de StreamReader pour permettre la lecture du fichier source
                Dim monStreamReader As StreamReader = New StreamReader(ToolStripTextBox1.Text)   ' exemple lire : "C:\sb\0.ech")  
     
                 'Création du nouveau dossier du fichier tampon s'il n'éxiste pas déja
                If Directory.Exists("c:\test\") = False Then Directory.CreateDirectory("c:\test\")
     
                'détruit le fichier tampon précédent s'il existe
                If File.Exists("c:\test\amendement.txt") = True Then File.Delete("c:\test\amendement.txt")
                'Pour enregistre 
                Dim strFile As String = "c:\test\amendement.txt" ' fichier tampon pour enregistrer le fichier et ses corrections.
     
                Dim monStreamWriter As StreamWriter
                If (Not File.Exists(strFile)) Then
                    monStreamWriter = File.CreateText(strFile)
                Else
                    monStreamWriter = File.AppendText(strFile)
                End If
     
                'Lecture et enregistrement dans le tampon des problèmes de 1 à NumerProb -1 
                For Me.nnn = 1 To NumeroProb - 1
     
                    'Lecture de 25 lignes de chaque problème
                    For Me.n = 1 To 25
                        Ligne(Me.n) = monStreamReader.ReadLine()
                    Next Me.n
     
                    'enregistre les 25 lignes
                    monStreamWriter.WriteLine(Ligne(1) + Chr(13) + Chr(10) + Ligne(2) + Chr(13) + Chr(10) + Ligne(3) + Chr(13) + Chr(10) + Ligne(4) + Chr(13) + Chr(10) + Ligne(5) + Chr(13) + Chr(10) _
                                 + Ligne(6) + Chr(13) + Chr(10) + Ligne(7) + Chr(13) + Chr(10) + Ligne(8) + Chr(13) + Chr(10) + Ligne(9) + Chr(13) + Chr(10) + Ligne(10) + Chr(13) + Chr(10) _
                                 + Ligne(11) + Chr(13) + Chr(10) + Ligne(12) + Chr(13) + Chr(10) + Ligne(13) + Chr(13) + Chr(10) + Ligne(14) + Chr(13) + Chr(10) + Ligne(15) + Chr(13) + Chr(10) _
                                 + Ligne(16) + Chr(13) + Chr(10) + Ligne(17) + Chr(13) + Chr(10) + Ligne(18) + Chr(13) + Chr(10) + Ligne(19) + Chr(13) + Chr(10) + Ligne(20) + Chr(13) + Chr(10) _
                                 + Ligne(21) + Chr(13) + Chr(10) + Ligne(22) + Chr(13) + Chr(10) + Ligne(23) + Chr(13) + Chr(10) + Ligne(24) + Chr(13) + Chr(10) + Ligne(25) & " - " & DateTime.Now)
                Next Me.nnn
     
                'Phase 2 : Lecture et enregistrement dans le tampon du problème NumeroProb dont la correction est validée. 
     
                'Lecture de 25 lignes du problème 
                For Me.n = 1 To 25
                    Ligne(Me.n) = monStreamReader.ReadLine()
                Next Me.n
     
                'Lecture des lignes du problème affiché à l'écran avec ou sans correction
                Ligne(1) = TextBoxNum.Text
                Ligne(2) = TextBoxName.Text
                Ligne(6) = TextBoxDate.Text
                Ligne(7) = TextBoxPrix.Text
                Ligne(9) = TextBoxSource.Text
                Ligne(18) = TextBoxEnonce.Text
                Ligne(19) = TextBoxNbPieces.Text
                Ligne(21) = Replace(RichTextBoxSolution.Text, Chr(10), " ") 'supprime les retours à la ligne
                Ligne(25) = "UTF32-8 FR"
     
                'enregistre les 25 lignes
                monStreamWriter.WriteLine(Ligne(1) + Chr(13) + Chr(10) + Ligne(2) + Chr(13) + Chr(10) + Ligne(3) + Chr(13) + Chr(10) + Ligne(4) + Chr(13) + Chr(10) + Ligne(5) + Chr(13) + Chr(10) _
                             + Ligne(6) + Chr(13) + Chr(10) + Ligne(7) + Chr(13) + Chr(10) + Ligne(8) + Chr(13) + Chr(10) + Ligne(9) + Chr(13) + Chr(10) + Ligne(10) + Chr(13) + Chr(10) _
                             + Ligne(11) + Chr(13) + Chr(10) + Ligne(12) + Chr(13) + Chr(10) + Ligne(13) + Chr(13) + Chr(10) + Ligne(14) + Chr(13) + Chr(10) + Ligne(15) + Chr(13) + Chr(10) _
                             + Ligne(16) + Chr(13) + Chr(10) + Ligne(17) + Chr(13) + Chr(10) + Ligne(18) + Chr(13) + Chr(10) + Ligne(19) + Chr(13) + Chr(10) + Ligne(20) + Chr(13) + Chr(10) _
                             + Ligne(21) + Chr(13) + Chr(10) + Ligne(22) + Chr(13) + Chr(10) + Ligne(23) + Chr(13) + Chr(10) + Ligne(24) + Chr(13) + Chr(10) + Ligne(25) & " - " & DateTime.Now)
     
                'Phase 3 : Lecture et enregistrement dans le tampon des problèmes de Numero Prob +1 à DerNum 
     
                For Me.nnn = NumeroProb + 1 To DerNum
     
                    'Lecture de 25 lignes de chaque problème
                    For Me.n = 1 To 25
                        Ligne(Me.n) = monStreamReader.ReadLine()
                    Next Me.n
     
                    'enregistre les 25 lignes
                    monStreamWriter.WriteLine(Ligne(1) + Chr(13) + Chr(10) + Ligne(2) + Chr(13) + Chr(10) + Ligne(3) + Chr(13) + Chr(10) + Ligne(4) + Chr(13) + Chr(10) + Ligne(5) + Chr(13) + Chr(10) _
                                 + Ligne(6) + Chr(13) + Chr(10) + Ligne(7) + Chr(13) + Chr(10) + Ligne(8) + Chr(13) + Chr(10) + Ligne(9) + Chr(13) + Chr(10) + Ligne(10) + Chr(13) + Chr(10) _
                                 + Ligne(11) + Chr(13) + Chr(10) + Ligne(12) + Chr(13) + Chr(10) + Ligne(13) + Chr(13) + Chr(10) + Ligne(14) + Chr(13) + Chr(10) + Ligne(15) + Chr(13) + Chr(10) _
                                 + Ligne(16) + Chr(13) + Chr(10) + Ligne(17) + Chr(13) + Chr(10) + Ligne(18) + Chr(13) + Chr(10) + Ligne(19) + Chr(13) + Chr(10) + Ligne(20) + Chr(13) + Chr(10) _
                                 + Ligne(21) + Chr(13) + Chr(10) + Ligne(22) + Chr(13) + Chr(10) + Ligne(23) + Chr(13) + Chr(10) + Ligne(24) + Chr(13) + Chr(10) + Ligne(25) & " - " & DateTime.Now)
                Next Me.nnn
     
                'Fermeture du StreamReader 
                monStreamReader.Close()
                'Fermeture du StreamWriter           
                monStreamWriter.Close()
     
                'Code exécuté en cas d'exception
            Catch ex As Exception
                MessageBox.Show(ex.Message & "Stack Trace: " & vbCrLf & ex.StackTrace))
            End Try
     
            'Phase 4 : remplacer le fichier source par le contenu du fichier tampon
            ' à écrire
     
     
        End Sub
    [B]Est-ce la bonne méthode à appliquer ?Je ne trouve rien de plus simple et compact en ligne ! L'idéal serait de trouver une fonction qui me permet d'écrire directement sur les lignes 226 à 250 dans mon exemple vu plus haut sans écrire toute cette usine à gaz ! [B]

    En vous remerciant pour votre aide.

    A vous lire

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    La seule façon de récupérer et/ou de modifier un fichier texte, passe par la lecture et la réécriture au complet.

    Au mieux, tu pourrais lire tout ton fichier dans une List(of string) ou un dictionnaire avec numéro et contenu de la ligne), ou même une DataTable. (Attention aux indices), changer les valeurs directement dans le contrôle et réécrire ton fichier.

    Ou bien, tu fais "évoluer" ton fichier texte en fichier xml. Et là, le Framework te permet de modifier le fichier, d'une manière transparente.

    Personnellement, je n'aime pas cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      'enregistre les 25 lignes
                    monStreamWriter.WriteLine(Ligne(1) + Chr(13) + Chr(10) + Ligne(2) + Chr(13) + Chr(10) + Ligne(3) + Chr(13) + Chr(10) + Ligne(4) + Chr(13) + Chr(10) + Ligne(5) + Chr(13) + Chr(10) _
                                 + Ligne(6) + Chr(13) + Chr(10) + Ligne(7) + Chr(13) + Chr(10) + Ligne(8) + Chr(13) + Chr(10) + Ligne(9) + Chr(13) + Chr(10) + Ligne(10) + Chr(13) + Chr(10) _
                                 + Ligne(11) + Chr(13) + Chr(10) + Ligne(12) + Chr(13) + Chr(10) + Ligne(13) + Chr(13) + Chr(10) + Ligne(14) + Chr(13) + Chr(10) + Ligne(15) + Chr(13) + Chr(10) _
                                 + Ligne(16) + Chr(13) + Chr(10) + Ligne(17) + Chr(13) + Chr(10) + Ligne(18) + Chr(13) + Chr(10) + Ligne(19) + Chr(13) + Chr(10) + Ligne(20) + Chr(13) + Chr(10) _
                                 + Ligne(21) + Chr(13) + Chr(10) + Ligne(22) + Chr(13) + Chr(10) + Ligne(23) + Chr(13) + Chr(10) + Ligne(24) + Chr(13) + Chr(10) + Ligne(25) & " - " & DateTime.Now)
    et je ferais (À la volée et non testé. attention)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i as integer =1 to 25
        select case i
            case 1
                  monStreamWriter.WriteLine(ligne(i) & vbnewline & vbnewline)
            case 2 to 24
                 monStreamWriter.WriteLine(ligne(i) & vbnewline)
            case else
                 monStreamWriter.WriteLine(ligne(i) &  DateTime.Now)
        end select
    next
    P.S. Si j'ai bien compris/deviné, le fond ton problème tu pourrais essayer une version toute Word, ou une combinaison VB.net-Word.

    Tu peux regarder là pour l'inspiration

  3. #3
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 323
    Par défaut
    Bonjour Clementmarcotte,

    Merci pour tes réponses.

    Pour la première partie l'idée de faire évoluer mon fichier en xml me parais intéressante car en pratique ses fichiers textes (assez gros) vont atteindre une taille volontairement limité à 100000 feuille soit 2500000 lignes. Je vais creuser cette idée nouvelle pour moi. Le danger en réécrivant le fichier intégralement comme je le fait dans l'exemple est la panne de courant ou autre aléas de Windows..... ce qui nécessite une triple sauvegarde puis comparaison etc.. Bref beaucoup de temps perdu et du lourd! Le fichier texte est en UTF-8 donc doit logiquement être transposable en xml si j'ai bien compris.

    Pour l'écriture du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    monStreamWriter.WriteLine(Ligne(1) + Chr(13) + Chr(10) + Ligne(2) + Chr(13) + Chr(10) ....
    , je l'ai mis à la volé pour l'illustration (origine un vieux programme en Power Basic) mais j'avais bien prévu une écriture plus light. Merci pour ton idée de 'Case' je l'avait un peu oublié (il existait déjà avec Power Basic!)

    Concernant ta dernière intuition pour une solution vb.net / word ou tout word en fait cela me parait apparemment pas envisageable car cette application est une infime part d'un gros programme d'enregistrement, lecture, correction et résolution de problèmes d'échecs que je fait évoluer depuis Visual Basic 6. Je vais toutefois étudier avec soin le lien que tu me donne, je pense que je peut en tirer quelque chose. Chaque 'feuille' représente un problème d'échec et tout ses attributs : Auteur, année , publication, solutions ... décrit sur 25 lignes. Le module de résolution de problèmes d'échecs très performant (et en shareware ! ) est écrit en C. J'ai le mode d'emploi et tout le source non documenté par les auteurs .... Pour le moderniser en C# je suis perdu ! Mais là c'est une autre histoire pour les rubriques C et C# avis aux amateurs!

    Merci et à plus pour la suite de mes recherches.

  4. #4
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 323
    Par défaut
    Le code avec Case qui fonctionne est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     'enregistre les 25 lignes
     
                    For i As Integer = 1 To 25
                        Select Case i
                            Case 1 To 24
                                monStreamWriter.WriteLine(Ligne(i))
                            Case 25
                                monStreamWriter.WriteLine(Ligne(25) & " - " & DateTime.Now)
                        End Select
                    Next
    On notera que j'ai supprimé vbnewline car la fonction Case ajoute automatiquement le retour chariot.

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,
    On notera que j'ai supprimé vbnewline car la fonction Case ajoute automatiquement le retour chariot.
    M'est avis que tu devrais ouvrir ton aide locale de toute urgence. C'est WriteLine qui ajoute le retour à la ligne.

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 134
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     'enregistre les 25 lignes
                    For i As Integer = 1 To 24
                        'Select Case i
                            'Case 1 To 24
                                monStreamWriter.WriteLine(Ligne(i))
                            'Case 25
                                'monStreamWriter.WriteLine(Ligne(25) & " - " & DateTime.Now)
                        'End Select
                    Next
                    monStreamWriter.WriteLine(Ligne(25)) & " - " & DateTime.Now)
    Édit:
    Je me demande s'il n'est pas possible de faire comme çà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim dernierLigne as string = Ligne(Ligne.Length) & " - " & DateTime.Now
    ReDim Preserve Ligne(Ligne.Length-1)
    Dim result As String = String.Join(vbnewline, Ligne)
    result = result & dernierLigne
    monStreamWriter.WriteLine(result)
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

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

Discussions similaires

  1. Comment bien utiliser la fonction preventDefault()
    Par benoit256255 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2017, 15h57
  2. Réponses: 1
    Dernier message: 16/09/2015, 16h53
  3. Réponses: 3
    Dernier message: 27/02/2008, 12h07
  4. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 20h20
  5. [EasyPHP] Comment utiliser la fonction mail avec EasyPHP ?
    Par baguira dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 09/03/2007, 01h32

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