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 :

Modifier un fichier texte volumineux


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut Modifier un fichier texte volumineux
    Bonjour,

    Je souhaite modifier un fichier txt de 6mo, mais j'ai un dépassement de capacité de ma variable string.
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim SR As System.IO.StreamReader
    SR = New System.IO.StreamReader(CheminDuFichier, System.Text.Encoding.Default)
    Dim Texte As String = SR.ReadToEnd
    Merci d'avance pour vos conseils.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par JulieF Voir le message
    Je souhaite modifier un fichier txt de 6mo, mais j'a.
    Euh, il manquerait pas un bout de ta phrase ?

    6Mo c'est pas énorme, ça devrait pas poser de problème, sauf sur une machine très, très vieille...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tu as quoi comme erreur.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Je fais un programme pour un Windows mobile 6.5, sous Compact Framework 3.5.

    Je souhaite modifier un fichier txt, et je commence par le lire.
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim SR As System.IO.StreamReader
    SR = New System.IO.StreamReader(CheminDuFichier, System.Text.Encoding.Default)
    Dim Texte As String = SR.ReadToEnd
    Cela fonctionne bien avec un petit fichier, mais avec mon fichier de 6mo, j'ai une erreur de dépassement de capacité de ma variable string.

    J'ai essayé en utilisant un tableau. Ca fonctionne mais c'est long. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            Dim tabTmp() As String
            Dim SR As System.IO.StreamReader
            SR = New System.IO.StreamReader(CheminDuFichier, System.Text.Encoding.Default)
            Dim i As Integer = 0
            While Not SR.EndOfStream
                ReDim Preserve tabTmp(i)
                tabTmp(i) = SR.ReadLine()
                End If
                i = i + 1
            End While
            SR.Close()
    Est-il possible de ne modifier qu'une seule ligne sans charger tout le fichier ?

  5. #5
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour,

    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ReDim Preserve tabTmp(i)
    c'est un peu lourd a mon avis, alors dans une boucle....

    j'ai trouvé un code tout simple de tomlev
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim lignes() As String = File.ReadAllLines("leFichier.txt")
    Dim nLignes = lignes.Length ' Nombre de lignes
    voir ce post:

    http://www.developpez.net/forums/d667487/dotnet/developpement-windows/windows-forms/vb-net-compter-nb-ligne-fichier-txt/



    Est-il possible de ne modifier qu'une seule ligne sans charger tout le fichier ?
    non, mais avec ta boucle c'est bon.
    Le soucis c'est de savoir qu'elle ligne tu veux garder
    tu n'est pas obligé de toutes les enregistrées, tu garde que le numéro de la ligne qui t'interesse. ça t'évitera de faire un dépassement de capacité avec ReDim

    Aprés c'est pareil, on ne sais pas ce que tu veux faire avec ce traitement donc... dur de te dire plus.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Je n'ai pas "ReadAllLines" en Compact Framework 3.5. J'ai "ReadToEnd".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim lignes() As String = SR.ReadToEnd
    Mais ca génère une erreur :
    Value of type 'String' cannot be converted to '1-dimensional array of String'.
    Citation Envoyé par hunteshiva Voir le message
    tu n'est pas obligé de toutes les enregistrées, tu garde que le numéro de la ligne qui t'interesse.
    Ca m'a l'air d'être une bonne idée. Je vais essayé ca.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par hunteshiva Voir le message
    tu n'est pas obligé de toutes les enregistrées, tu garde que le numéro de la ligne qui t'interesse.
    Je ne vois pas trop comment faire.
    Si je lis mon fichier et que je repère le n° de la ligne à modifier, comment je fais ensuite pour l'écrire vu que je n'ai que la position ? Dois-je quand même stocker le fichier dans un tableau ?

  8. #8
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Plus simplement, j'ignore d'où vient le problème du dépassement de capacité (limite de Windows Mobile ?) mais il suffit de lire 8ko, les écrire, lire les 8ko suivants, les écrire, etc.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Plus simplement, j'ignore d'où vient le problème du dépassement de capacité (limite de Windows Mobile ?) mais il suffit de lire 8ko, les écrire, lire les 8ko suivants, les écrire, etc.
    Je ne vois pas comment faire ca. Est-ce que je pourrais par exemple lire et écrire 10 lignes par 10 lignes ?

  10. #10
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Citation Envoyé par JulieF Voir le message
    Je ne vois pas comment faire ca. Est-ce que je pourrais par exemple lire et écrire 10 lignes par 10 lignes ?
    Oui, ou même ligne par ligne (si ton précédent code était lent c'était à cause des redimensionnements de tableau en chaîne, rien n'empêche d'écrire une variante rapide).

    PS : Plus j'y réfléchis, plus je me dis qu'il ne doit y avoir aucune limite de capacité spécifique à WIndows Mobile. Tu es sûre que ton fichier fait 6Mo et non 6Go ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Aurais-tu un exemple de ce que tu me suggères ?

    Concernant mon code de départ, je l'avais indiqué au début du post. Le voici de nouveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Dim SR As System.IO.StreamReader
            SR = New System.IO.StreamReader(NomDuFichier, System.Text.Encoding.Default)
            Dim Texte As String = SR.ReadToEnd
            SR.Close()
    Qui génère l'erreur "OutOfMemoryException" à la ligne 3 (Dim Texte As String = SR.ReadToEnd) uniquement sur le fichier de 6mo. Les autres passent très bien.

  12. #12
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Salut

    si tu codes ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SR = New System.IO.StreamReader(path, System.Text.Encoding.Default)
            Dim texte As New List(Of String)
            For Each line In SR.ReadLine
                texte.Add(line)
            Next

  13. #13
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Qui génère l'erreur "OutOfMemoryException" à la ligne 3 (Dim Texte As String = SR.ReadToEnd) uniquement sur le fichier de 6mo. Les autres passent très bien.
    essaie ainsi pour voir quelle ligne cause l'erreur dans ton fichirer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     SR = New System.IO.StreamReader(path, System.Text.Encoding.Default)
            Dim texte As New List(Of String)
            Dim count As Int64 = 1
            Try
                For Each line In SR.ReadLine
                    texte.Add(line)
                    count += 1
                Next
            Catch ex As Exception
                MessageBox.Show("line number = " & count)
            End Try

  14. #14
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    @Shayw
    Visiblement le téléphone en question est limité en termes de mémoire (ou restreint l'espace autorisé pour chaque processus), donc on a toutes les chances de retrouver le problème avec une liste. Il suffit d'écrire au fur et à mesure, toute autre solution sera bancale.

    @JulieF
    En c# ce ne serait pas un problème mais je code en Vb comme mes pieds. Il te suffit de prendre le code de Shayw et de remplacer la ligne où il ajoutait à la liste par une autre où on écrira dans un streamwriter ouvert sur un autre fichier. Et à la fin on remplace le fichier par le nouveau.

    Par contre, le téléphone aura t-il assez de place pour contenir deux fichiers de 6 Mo ?

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par shayw Voir le message
    Salut

    si tu codes ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SR = New System.IO.StreamReader(path, System.Text.Encoding.Default)
            Dim texte As New List(Of String)
            For Each line In SR.ReadLine
                texte.Add(line)
            Next
    J'ai la même erreur !

    Citation Envoyé par DonQuiche Voir le message
    Il te suffit de prendre le code de Shayw et de remplacer la ligne où il ajoutait à la liste par une autre où on écrira dans un streamwriter ouvert sur un autre fichier. Et à la fin on remplace le fichier par le nouveau.
    J'avais aussi pensé à cette solution. Mais sans utiliser de liste, ni tableau. En lisant et en écrivant directement.

    C'est ce que j'ai fais. Cela fonctionne bien.
    Merci à tous pour votre aide.

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

Discussions similaires

  1. [Fichier Textes]Scruter fichier texte volumineux
    Par hawax dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 18/10/2006, 18h53
  2. [vb.net] Modifier un fichier texte
    Par olbi dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/10/2006, 15h31
  3. Réponses: 3
    Dernier message: 06/10/2006, 14h21
  4. comment utiliser Notepad pour modifier un fichier texte?
    Par moon13_698 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 06/05/2006, 15h41
  5. Recherche dans un fichier texte volumineux.
    Par Actarus69 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 27/07/2005, 17h39

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