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

  1. #1
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    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
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  2. #2
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    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
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    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.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  4. #4
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    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.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  5. #5
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    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.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 177
    Points
    17 177
    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)
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour

    Je pense que son principal problème de la ligne 25 c'est qu'il a oublié qu'en VB.net, les indices commencent obligatoirement à zéro.

    Et comme je ne me suis pas badré de son Dim invisible...

    Mais j'avais mis :

    (Attention aux indices)
    Cela fait qu'il devrait soit itérer de 0 à 24, soit dimensionner son tableau à 26.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    lu en diagonale, mais avec un filestream je pense qu'on peut seek à un endroit puis write par dessus ce qui est déjà présent

    ca serait dommage d'être obligé de réécrire un gros fichier pour ne modifier qu'une partie alors qu'on peut dans d'autres langages
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    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)
    Merci pour l'idée

    Effectivement en partant avec l'indice 0 on peut le faire, sauf que je décale la logique de tout le fichier séquentiel traité par ailleurs (modulo 25) d'où erreur à la prochaine lecture. Je vais réfléchir à la question.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  10. #10
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    lu en diagonale, mais avec un filestream je pense qu'on peut seek à un endroit puis write par dessus ce qui est déjà présent
    Je n'ai pas regardé. Mais, cela implique de gérer la longueur du texte pour enlever le vieux texte qui dépasse, ou ajouter de l'espace pour les textes plus longs

    ca serait dommage d'être obligé de réécrire un gros fichier pour ne modifier qu'une partie alors qu'on peut dans d'autres langages
    Pour cela, le suis bien d'accord. Mais il parle malheureusement de fichiers texte.

    Il dit que son programme est d'origine en VB6. En voyant sa réaction à ma boucle, j'ai bien peur d'avoir deviné qu'il a un paquet de tableaux qui partent à l'indice 1. Si c'est bien cela, mais il n'en parle pas; pour devoir vivre avec l'indice zéro obligatoire en VB.net, et préserver la fiabilité de son programme, il va devoir ajouter 1 à toutes ses dimensions de tableau, avec toute la mémoire gaspillée que cela implique; ou bien, il fait une chasse aux indices et compteurs de boucles et tout le débogage qui vient avec. Ou bien, il risque de devoir remplacer ses fichiers texte par autre chose : Excel, même si cela ne m'enchante pas vraiment, Access ou un autre SGBD. Là, il ouvrirait son fichier, qu'il pourrait changer avec des requêtes SQL et le réenregistrerait en sortant. Mais, et oui, encore du débogage.

    Et, même s'ils sont supportés en VB.net. les tableaux VB6 ne sont probablement pas la solution idéale. Même si MS a un certain respect pour la compatibilité avec ses anciennes applications, (Excel supporte toujours les macros xll, pré-VBA et écrites en C), ils pourraient être tentés un jour ou l'autre, d'éliminer les vieilles caractéristiques de VB6 qui font double emploi avec des choses plus récentes de VB.net.

    Mais, cela reste quand même un gros contrat et lui seul peut prendre la décision.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  11. #11
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par excalybur Voir le message
    Merci pour l'idée

    Effectivement en partant avec l'indice 0 on peut le faire, sauf que je décale la logique de tout le fichier séquentiel traité par ailleurs (modulo 25) d'où erreur à la prochaine lecture. Je vais réfléchir à la question.
    Ta réponse est arrivée pendant que je rédigeais la mienne à Pol63, mais, cela semble confirmer ma peur.


    Encore qu'il semblerait (jamais essayé) que l'on puisse accéder à, ou du moins lire, un fichier texte, comme si c'était une base de données
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  12. #12
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    lu en diagonale, mais avec un filestream je pense qu'on peut seek à un endroit puis write par dessus ce qui est déjà présent

    ca serait dommage d'être obligé de réécrire un gros fichier pour ne modifier qu'une partie alors qu'on peut dans d'autres langages
    C'est bien là le problème. Aurait-tu une idée pour le code car là je sèche ?

    Je note aussi le commentaire de ClementMarcotte :
    Citation Envoyé par clementmarcotte Voir le message
    Je n'ai pas regardé. Mais, cela implique de gérer la longueur du texte pour enlever le vieux texte qui dépasse, ou ajouter de l'espace pour les textes plus longs.
    Effectivement certaines lignes ont une longueur variable comme la 'solution' qui peut aller de 10 à 100000 caractères. Mais il peut être un moyen pour ces 15 lignes 'variable' modulo 25.

    Merci
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu n'as pas des tailles fixes ca va compliquer le tout

    ca resterait faisable, mais pourquoi ne pas utiliser une base de données genre sqlite ? c'est gratuit, ca reste un fichier qui contient les données, et ca s'occupe de gérer l'alignement des données ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    Par défaut
    Bonsoir,

    Merci pour vos idées.

    La solution Sqlite semble prometteuse mais méga problème après chargement : VS Express 2012 ne supporte pas l’installation de Sqlite. OK c'est une version limitée! Avant d'acheter une licence VS pro 2012 d'occasion à un prix démocratique qui peut faire le test et mettre quelques lignes ?

    En attendant j'étudie la solution xml et je reviens vers vous.

    A+
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  15. #15
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,


    Citation Envoyé par excalybur Voir le message
    Bonsoir,

    Merci pour vos idées.
    Avant d'acheter une licence VS pro 2012 d'occasion à un prix démocratique qui peut faire le test et mettre quelques lignes ?


    A+
    Pas besoin. Visual Studio Community est gratuit et vient avec SQLite. Et il peut fonctionner avec SQL Server Express gratuit et plus puissant que SQLite.

    Le seul problème : Cela peut être long longtemps pour télécharger et installer
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    sqlite n'a jamais été payant, donc l'utiliser sur vs express 2012 est possible
    les assistants de connexions de vs ne sont que sur les versions payantes, mais il ne servent pas à grand chose
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    Par défaut
    Bonjour,

    Un peu de neige ce matin sur la cote d'azur. Pas de jaloux !

    Pour revenir à mon sujet de fichier, je viens de tester xml après j'attaque SQL pour faire mon choix. Mais d'abord j'essaie de maitriser xml.

    Concernant la création du fichier xml je vous joint mon code exemple :

    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
     
    Imports System.IO
    Imports System.Reflection
    Imports System.Linq
    Imports System.Xml.Linq
     
     
     
     Dim doc = <deuxcoups>
                              <pb>
                                  <numero>1</numero>
                                  <auteur>Chat</auteur>
                                  <date>1992</date>
                              </pb>
                              <pb>
                                  <numero>2</numero>
                                  <auteur>Chien</auteur>
                                  <date>2018</date>
                              </pb>
                              <pb>
                                  <numero>3</numero>
                                  <auteur>Cheval</auteur>
                                  <date>2001</date>
                              </pb>
                              <pb>
                                  <numero>4</numero>
                                  <auteur>Hibou</auteur>
                                  <date>2015</date>
                              </pb>
                              <pb>
                                  <numero>5</numero>
                                  <auteur>Grand duc</auteur>
                                  <date>1998</date>
                              </pb>
                          </deuxcoups>
     
     
                Dim sw = New StringWriter()
                'save to XmlWriter
                Dim settings = New Xml.XmlWriterSettings()
                settings.Indent = True
     
                Dim writer = Xml.XmlWriter.Create(sw, settings)
                doc.Save(writer)
                writer.Close()
     
                'sauvegarde
                doc.Save("c:\sb\out.xml")
     
                'Lire le fichier xml
                Dim xmldoc As New System.Xml.XmlDocument
                xmldoc.Load("c:\sb\out.xml")
                Dim allText As String = "Fichier xml = " + xmldoc.InnerXml + vbCrLf + vbCrLf + "Fichier texte = " + xmldoc.InnerText
     
                'visualise le fichier xml et texte
                TextBox1.Text = allText

    Le Textbox1 est dans une form.

    On obtient le fichier out.xml :
    Code XML : 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
    <?xml version="1.0" encoding="utf-8"?>
    <deuxcoups>
      <pb>
        <numero>1</numero>
        <auteur>Chat</auteur>
        <date>1992</date>
      </pb>
      <pb>
        <numero>2</numero>
        <auteur>Chien</auteur>
        <date>2018</date>
      </pb>
      <pb>
        <numero>3</numero>
        <auteur>Cheval</auteur>
        <date>2001</date>
      </pb>
      <pb>
        <numero>4</numero>
        <auteur>Hibou</auteur>
        <date>2015</date>
      </pb>
      <pb>
        <numero>5</numero>
        <auteur>Grand duc</auteur>
        <date>1998</date>
      </pb>
    </deuxcoups>

    Mes questions :

    1/ xmldoc.InnerText donne un texte au km dans le textBox1. Est-il possible dans le textbox1 de faire les retours à la ligne à la fin de chaque balise </pb> ?

    2/ Si je veux remplacer le contenu des lignes nom et date du problème balise n°4 comment dois-je écrire le code ? Je ne trouve pas la solution.

    Merci d'avance pour vos idées.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  18. #18
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    Par défaut
    En continuant mes recherches je trouve cette écriture plus élégante mais cela ne répond pas à la question de base : Comment remplacer une (ou plusieurs) lignes données sans ré-écrire tout le fichier?

    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
     
    Imports System.Xml
    Public Class Form1
     
     Private Function pPrice() As String
            Throw New NotImplementedException()
        End Function
     
        Private Function pName() As String
            Throw New NotImplementedException()
        End Function
     
        Private Function pID() As String
            Throw New NotImplementedException()
        End Function
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim writer As New XmlTextWriter("product.xml", System.Text.Encoding.UTF8)
            writer.WriteStartDocument(True)
            writer.Formatting = Formatting.Indented
            writer.Indentation = 2
            writer.WriteStartElement("Table")
            createNode(1, "Product 1", "1000", writer)
            createNode(2, "Product 2", "2000", writer)
            createNode(3, "Product 3", "3000", writer)
            createNode(4, "Product 4", "4000", writer)
            writer.WriteEndElement()
            writer.WriteEndDocument()
            writer.Close()
        End Sub
        Private Sub createNode(ByVal pID As String, ByVal pName As String, ByVal pPrice As String, ByVal writer As XmlTextWriter)
            writer.WriteStartElement("Product")
            writer.WriteStartElement("Product_id")
            writer.WriteString(pID)
            writer.WriteEndElement()
            writer.WriteStartElement("Product_name")
            writer.WriteString(pName)
            writer.WriteEndElement()
            writer.WriteStartElement("Product_price")
            writer.WriteString(pPrice)
            writer.WriteEndElement()
            writer.WriteEndElement()
        End Sub
    End Class
    Le résultat :

    Code XML : 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
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Table>
      <Product>
        <Product_id>1</Product_id>
        <Product_name>Product 1</Product_name>
        <Product_price>1000</Product_price>
      </Product>
      <Product>
        <Product_id>2</Product_id>
        <Product_name>Product 2</Product_name>
        <Product_price>2000</Product_price>
      </Product>
      <Product>
        <Product_id>3</Product_id>
        <Product_name>Product 3</Product_name>
        <Product_price>3000</Product_price>
      </Product>
      <Product>
        <Product_id>4</Product_id>
        <Product_name>Product 4</Product_name>
        <Product_price>4000</Product_price>
      </Product>
    </Table>
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  19. #19
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par excalybur Voir le message
    En continuant mes recherches je trouve cette écriture plus élégante mais cela ne répond pas à la question de base : Comment remplacer une (ou plusieurs) lignes données sans ré-écrire tout le fichier?
    Il y a des classes dédiés pour changer le contenu d'un fichier XML existant

    https://docs.microsoft.com/fr-fr/dot...-the-dom-model

    https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  20. #20
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    305
    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 : 305
    Points : 181
    Points
    181
    Par défaut
    Merci pour l'info.

    Il est clair qu'il faut travailler avec la mémoire du PC. Par contre la correction réécrit-elle tout le fichier ou simplement les lignes modifiées ? Sinon je me pose la question de l'économie de temps.
    La Connaissance est comme le rire elle est contagieuse en la partageant!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 14h57
  2. Réponses: 1
    Dernier message: 16/09/2015, 15h53
  3. Réponses: 3
    Dernier message: 27/02/2008, 11h07
  4. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 19h20
  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, 00h32

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