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

Windows Forms Discussion :

[VB.NET] - Traitement de fichier texte


Sujet :

Windows Forms

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [VB.NET] - Traitement de fichier texte
    Bonjour à tous,

    Voilà mon souci.
    J'ai fais un code qui à pour but de traiter un fichier texte ligne par ligne.
    Il copie chaque ligne lue dans un nouveau fichier texte si elle ne commence pas pas "xxxx" (valeur saisie).

    Le but étant vous l'aurait compris de supprimer des lignes précises dans un fichier normé (EDI).

    J'utilise pour cela un StreamReader pour lire le fichier ligne par ligne, puis un StreamWriter pour écrire le nouveau fichier, et à la fin du traitement, je "Flush" pour avoir le fichier final.

    Tout ca ok, j'y arrive bien. Mais le problème est que plus le fichier est important, et plus le soft tourne longtemps.
    Sur un fichier d'une centaine de ligne, il faut quelques secondes pour avoir le résultat. Sur un fichier de 50000 lignes, là, je passe à plusieurs heures de traitements !!!

    J'ai mis un compteurs de lignes traités pour voir le déroulement, je passe de plusieurs lignes secondes à plusieurs secondes par lignes !!!!

    Est-ce du au StreamReader et StreamWriter ??
    Dois-je utiliser d'autres classes ou méthode d'accès aux données ???

    Je trouve cela vraiment trop long pour un traitement aussi "simple" !

    Merci d'avance si quelqu'un à déjà rencontré ce problème et m'aiguiller pour une autres méthode de traitement, ou d'optimisation...

  2. #2
    Expert confirmé
    Avatar de debug
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 034
    Points : 4 093
    Points
    4 093
    Par défaut
    Tu as bien vérifié tes allocations mémoire, ça pourrait surcharger les traitements à partir d'un certain nombres de lignes. Par exemple un 'new' dans ta boucle.
    May the Troll, be with you
    (Que le troll soit avec toi)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Salut,

    Ton problème c'est que pendant tout le traitement tu multiplie les opérations de lecture écriture.

    J'utilise la méthode suivante qui fait, une lecture, un traitement, et une écriture.

    Dim myArray() as string= file.readAllLines(c:\toto.txt)

    Tu as alors tout dans un array de string
    Tu crées un autre array de strings (ou pourquoi pas un arraylist) et tu y places toutes les lignes qui t'intéressent (filtrée XXXX)

    Et puis tu fais

    File.writeAllLines(c:\toto.txt, myNewArray)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 58
    Points
    58
    Par défaut
    ton ralentissement peut venir du fait que "peut-etre" tu charges tes lignes dans des éléments visuels (TextBox, etc...) pendant le traitement.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci déjà pour ces réponses.

    En fait, j'utilise un StreamReader, et StreamWriter, et je n'ai le résultat que si je flush le fichier, j'ai donc (si je me trompe pas) pas d'acces multiple en ecriture du fichier sur le poste....

    Voilà le code, voyez vous quelque chose de "flagrant" pour vous ?

    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
    Try
                MFile = New StreamReader(VFile)
                Dim NFile As StreamWriter = New StreamWriter(Path.GetPathRoot(VFile) & "\Result.txt")
                Dim Vligne As String
                Dim CptUnt As Integer = 0
     
                If ZSSegm.Text <> Nothing Then
                    RTFile.Text = Nothing
                    While MFile.Peek > 0
                        Vligne = MFile.ReadLine
                        If Mid(Vligne, 1, 6) <> ZSSegm.Text Then
                            If Mid(Vligne, 1, 3) = "UNT" Then
                                Dim VTest As String = Vligne.ToString
                                Vligne = Mid(Vligne, 1, 4) & Comble(CptUnt) & Mid(Vligne, 11, Len(Vligne) - 10)
                                CptUnt = 0
                            End If
                            NFile.WriteLine(Vligne)
                            CptUnt += 1
                        End If
                        Me.Refresh()
                    End While
                    NFile.Flush()
                End If
     
                NFile.Close()
     
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try
    Je n'inscrit pas non plus de chose dans un element visuel sur la form comme dans une liste ou autre..

    Perso, je vois pas comment faire, d'autant plus que c'est vraiment de plus en plus long en fonction du nombre de ligne...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    re-salut

    Combien de MB en moyenne font tes fichiers ?

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    En moyenne 200 voir 300 Ko
    Pour 300 Ko, ca met 40 mn a être traité pour 13000 lignes environ.
    Celui de 1.2 Mo (57000 lignes environ), ca met plusieurs heures... pas comprendre..

    Les fichiers sont un peu de ce format (copie du début) :

    UNB+UNOA:2+3027700058107:14+9999999999999:14+061220:1319+00000000000262++PRICAT'
    UNH+00000000000001+PRICAT:93:UN'
    BGM+9:::FICHE PRODUIT'
    DTM+137:20061220 :102'
    NAD+FR+3027700058107::107'
    PGI+3+NV1'
    PIT++3'
    PIA+5+ESC:GU::AEE'
    IMD+++:::ESCOMPTE SUR FACTURE'
    PIT++3'
    PIA+5+INC:GU::AEE'
    IMD+++:::INCIDENTS REPART.FACACHAT'
    PIT++3'
    PIA+5+001:GU::AEE'
    IMD+++:::ENGRAIS'
    PIT++3'

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    re salut,

    Bon, je vais te donner quelques points de comparaisons.

    J'ai une appli qui traite une trentaine de fichiers txt tous les jours (entre 10 et 600 Ko par fichier).

    Mes fichiers font de 300 à 10000 lignes. Chaque ligne fait entre 30 et 80 caractères (avec quelques exceptions pouvant atteindre 2000 caractères)

    Pour chaque fichier, je lis chaque ligne, je met des données dans des variables (en moyenne 5 par ligne, mais mes variables sont différentes pour chaque type de ligne(+/-180 variables possibles)) ( je fais comme toi en utilisant le maVariable1= mid(maligne,..)).

    Je teste mes variables et, si j'ai une erreur, j'ajoute l'erreur dans un string qui servira alors à créé un fichier log.

    Si j'ai pas d'erreur, je crée en première ligne de mon fichier un "header". Je fais alors un ReadAllLines vers un tableau, j'ajoute mon header et puis je fais WriteAllLine dans un fichier TXT.
    TEMPS total du traitement 3 ... secondes pour les 30 fichiers. Donc il y a bien une différence de vitesse.

    La seule différence que je vois c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NFile.WriteLine(Vligne)
    Que tu utilises à chaque ligne ou presque alors que moi, (lorsque j'ai un log) je ne fais qu'une seule fois WriteAllLine.

    Si c'est vraiment critique pour toi, je testerais la technique que je t'ai proposée avant qui est de tout mettre dans un array de string.

    J'ai quand même remarqué que quand je reçois un fichier tout a fait faux je dois créer un fichier log qui devient énorme (jusqu'à 3MB par fichier) et mon temps de traitement se dégrade fortement (2 minutes) . Je me disais donc que c'était du au temps d'écriture des +/- 60 MB de log écrits sur le disque.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok, j'en conclu que c'est en fait l'écriture vers le nouveau fichier text qui doit être à l'origine de ce temps de traitement.

    Je vais essayer en passant par les tableaux, et de tout encrire ensuite en une seule fois comme tu me l'as proposé. Et puis je ferais un petit test comparatif.

    Mais c'est quand même dommage que ce soit si long.. Je pensais que tout se fesait en mémoire, et que ct la fonction "Flush" qui mettait réellement à jour sur le disque...

    Je modifie le code et test dès que j'en ai la possibilité.
    Merci en tout cas pour la piste à suivre

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 58
    Points
    58
    Par défaut
    si je ne m'abuse, enlève la ligne de code suivante:
    qui se trouve dans ta boucle, et tes soucis disparaitrons.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 51
    Points : 38
    Points
    38
    Par défaut Comme dit plus haut !
    Je n'inscrit pas non plus de chose dans un element visuel sur la form comme dans une liste ou autre
    Comme vient de te le faire remarquer A2rem tu met à jour une forme visuelle à chaque ecriture de ligne !

    Je pense qu'en suivant les deux conseils (une seule operation d'ecriture , pas de rafraichissement visuel) tu devrais t'en sortir !

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    En fait, je crois qu'il y avait plusieurs choses.
    J'ai retiré toutes mes déclarations "globale" en debut de classe pour les objets Stream, et ai utilisé les tableaux pour le traitement.

    Au lieu de passer quelques heures sur le fichier de 1 Mo, il ne passe plus que 2 mn environ...

    Je crois que c'est les déclarations du début qui me manger le plus de chose...
    Pour le refresh, du coup, je l'ai laissé.

    Merci beaucoup pour toute votre aide.

Discussions similaires

  1. [VB.NET 2.0] Fichier texte et caractères spéciaux
    Par exclusif dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/09/2006, 22h02
  2. [VB.NET]Problème lecture fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/05/2006, 16h05
  3. [VB.NET]générer un fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/05/2006, 16h22
  4. Réponses: 2
    Dernier message: 26/05/2004, 17h53
  5. [VB.NET] Importation de fichier texte
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/05/2004, 09h39

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