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 :

VB.Net - Lecture de fichiers csv


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut VB.Net - Lecture de fichiers csv
    Bonjour à tous,

    Je dois alimenter un datagridview via des fichiers csv.
    Ces fichiers font environ 50 000 lignes chacun et j'en manipule 5 ou 6.

    Au finish, mon DGV met une 10aines de sec... c'est trop long.

    Pour info j'utilise des expressions régulières et les patterns sont un peu longs afin d'éviter les confusions.

    A votre avis où est l'erreur : les patterns mal gaulés ? Il faut abandonner les expressions régulières ?

    Merci de vos conseils.

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Non c'est le fait de charger 300 000 lignes dans une grille qui est "stupide".
    Comment tu t'y retrouves pour traiter autant de lignes visuellement ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    C'est certain qu'un dgv avec meme juste 1.000 lignes, c'est deja pas exploitable (ou alors avec un GROS mal de tête )
    Alors avec beaucoup beaucoup plus, comme saumon, je vois pas trop l'interet.
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    +500000 pour Dany et Saumon !

    Sinon, il te reste le virtualmode.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    J'ai pas essayé 50 000 lignes, mais j'ai une appli qui en affiche 10 000 sans aucun problème (aussi bien en Framework 2.0 qu'en 3.5).

    Pour certains cas de lenteur anormale du DGV (j'ai pas identifié précisément la raison de cette lenteur, mais ce n'est pas le nombre de lignes), le passage au Framework 3.5 améliore les perf d'un facteur 10.

    Un grand nombre de ligne est parfaitement exploitable : on utilise des fonctions de recherche (avec occurence suivante et précédente), de tri (sur une ou plusieurs collobnnes) et un filtre dynamique sur le binding source.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Je ne charge pas 300 000 lignes, j'ai 1700 intitulés q(et donc 1700 lignes) que je recherche dans des fichiers de 10 000 à 300 000 lignes pour trouver des infos spécifiques à ces intitulés.
    C'est ca qui est long (d'ou l'utilisation d'expressions régulières.)

    C'est plus clair ?

    Merci.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Pour simplifier :

    Peut importe le DGV, comment rechercher rapidement des intitulés dans des fichiers de type csv (cad sans longueur d'enregistrement fixe) très longs ?

    Gracie.

  8. #8
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    C'est peut-être moi qui est pas assez exigeant mais j'ai l'impression que cherché dans 300 000 lignes en 10 secondes c'est assez acceptable.

    Tu cherches quoi, que ça se fasse en 5 secondes? 1? une fraction de seconde???
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  9. #9
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Aussi ça serait peut-être bien que tu nous post le code qui fait la recherche...
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    En fait la recherche dans les 300 000 lignes met plutôt 30 sec que 10.
    Mon boss qui code en C++ met moins d'une seconde...

  11. #11
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Et le code c'Est quoi?
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Exemple de code :

    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
        Sub CodePeriodicite()
     
            Dim StrmRdr = New StreamReader(Main.Path & "Monfichier.txt", System.Text.Encoding.Default)
            Str = StrmRdr.ReadToEnd()
            StrmRdr.Close()
            Dim StrTemp As String = ""
     
            For A As Int32 = 0 To DGV.Rows.Count-1
                StrTemp = DGV("Code Titre", A).Value
     
                'Le code titre est en longueur fixe sur 6 caractères :
                If Len(StrTemp) <> 6 Then
                    StrTemp &= " "
                Else
                    StrTemp &= ";"
                End If
     
                Dim RgExp As New Regex("1;0;" & StrTemp & "[^\r\n]+")
                Dim MtcColl As MatchCollection = RgExp.Matches(Str)
                Dim Mtc As Match
                For Each Mtc In MtcColl
                    SubChaine = Mtc.Value.Split(";")
                    DGV("Code Périodicité", A).Value = SubChaine(6)
                    Exit For
                Next
            Next
     
        End Sub

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Mais encore une fois peu importe mon code (puisqu'il est un peu lent) : dites moi ce que vous connaissez comme méthode efficace quand vous recherchez des strings dans de gros fichiers en longueurs de lignes non fixes.
    Merci bien.

  14. #14
    Membre averti Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Points : 305
    Points
    305
    Par défaut
    Je suis pas un expert la dedans mais de transposer toute ton fichier dans une variable Str c'Est pas un peu lourd?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Str = StrmRdr.ReadToEnd()
    Ça serait pas mieux d'y aller ligne par ligne...Remarque ça serait peut-être même pire, j'Essaie juste de réfléchir avec toi...

    Sinon va falloir qu'un gouru s'en mêle
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods


    JP

    Pour commencer en VB.Net: PLASSERRE!

    ou traducteur-sms.com

  15. #15
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par Faladin
    Sinon va falloir qu'un gouru s'en mêle

    Un gouru, c'est qqun qui se goure, non ??

    Si c'est ca, j'ai pitet une chance

    Bon, la, rapidos, tu as donc 1700 intitules a chercher dans 300 000 lignes ???

    De l'époque très lointaine ou je bossais indirectement pour du telecom, on avait des fichiers comme ça(en fait, beaucoup plus gros, vu qu'on arrivait a quelques millions de lignes), et, ce qui était le plus rapide, dans notre cas, c'était de charger le contenu des fichiers dans une bd, et de faire des requêtes dessus après...genre, tu pré-charges tas fichiers csv dans une base access...

    sinon, essaie peut-être de lire ligne a ligne, et de chercher tes 1700 intitules sur une seule ligne...

    tu peux peut-etre aussi essayer de faire directement une requete SQL sur ton fichier csv (vive le moteur JET OLEDB)

    je crois aussi qu'il existe des bibliotheque qui te permettent de convertir du csv en dataset...

    enfin, demande son code a ton boss
    (parvce que trouver toute les occurences de 1700 token dans 300 000 lignes reparties dans 5 fichiers en moins d'une seconde, chapitau )

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  16. #16
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    J'arrive après la guerre, je sais...

    Une hashtable n'aurait-elle pas fait l'affaire...

  17. #17
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    J'ai jeté un coup d'oeil rapide au code et n'utilisant pas trop les expressions régulières je n'ai pas tout suivi mais il ne serait pas plus simple étant donné que le fichier est du type csv de faire quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim fichier As String = String.Format("{0}Monfichier.txt",Main.Path)
    Dim champs As String()
    Dim delimiteur As String = ";"
    Using parseur As New TextFieldParser(fichier)
        parseur.SetDelimiters(delimiteur)
        While Not parseur.EndOfData
           champs = parseur.ReadFields()
           ' Mettre ici le test de vérification par exemple
           ' If champs(3).Length = 6 Then
               ' Action à effectuer
           ' End If
        End While
    End Using
    Code extrait du Snippet "Lire un fichier délimité"

    En espérant que cela puisse être utile..
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Discussions similaires

  1. [VB.NET]Compilation de fichiers csv
    Par Yolak dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/02/2010, 16h05
  2. lecture de fichier CSV
    Par bakaratoun dans le forum MATLAB
    Réponses: 12
    Dernier message: 07/12/2009, 17h00
  3. Réponses: 12
    Dernier message: 27/10/2009, 22h25
  4. [CSV] Lecture de fichier CSV
    Par fthem dans le forum Langage
    Réponses: 18
    Dernier message: 23/09/2008, 08h17
  5. [VB.Net] lecture de fichier EXCEL
    Par coutep dans le forum Windows Forms
    Réponses: 5
    Dernier message: 14/10/2006, 18h16

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