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

C# Discussion :

StreamReader sur fichier csv


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 969
    Points : 2 115
    Points
    2 115
    Par défaut StreamReader sur fichier csv
    Bonjour

    Je manipule des gros fichiers csv contenant des logs pour faire des analyses dessus et tracer des courbes.
    Je lis mon fichier aujourd'hui avec streamreader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!MonFichier.EndOfStream) 
    {
    LigneEnCours = MonFichier.ReadLine(); 
    string[] tabCSV = LigneEnCours.Split(';'); 
    ...
    J'ai 2 questions pour un problème (c'est lourd à lire au chargement) :
    -Y a t-il une solution plus puissante pour lire des logs dans un fichier CSV ?
    -Puis je faire la même chose sur un fichier binaire, sans le formatage CSV ? Avoir un fichier de donnée non lisible dans Excel ou un notepad mais avoir un fichier beaucoup plus léger puisqu'il contiendrait la valeur des données plutôt que les valeurs ASCII de leur écriture en clair.

    Merci par 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 : 42
    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 petitours Voir le message
    -Y a t-il une solution plus puissante pour lire des logs dans un fichier CSV ?
    A priori on peut pas faire beaucoup mieux ; tu lis les lignes une par une, ce qui évite de charger tout le contenu du fichier en mémoire en même temps, donc pas de problème de ce côté là. C'est peut-être le reste du traitement qui est lourd...

    Citation Envoyé par petitours Voir le message
    -Puis je faire la même chose sur un fichier binaire, sans le formatage CSV ? Avoir un fichier de donnée non lisible dans Excel ou un notepad mais avoir un fichier beaucoup plus léger puisqu'il contiendrait la valeur des données plutôt que les valeurs ASCII de leur écriture en clair.
    Tu pourrais effectivement utiliser un fichier binaire, mais à mon avis tu n'y gagnerais pas grand chose, et ce serait moins facile à manipuler ; comme je disais plus haut, je ne pense pas que ce soit la lecture proprement dite qui pose problème

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Après si tu ne veux pas bloquer ton application pendant la lecture de fichier, utilise un backgroundworker. ou autre tache parallèle pour lire ton fichier.

  4. #4
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 969
    Points : 2 115
    Points
    2 115
    Par défaut
    bonjour et merci pour vos réponses

    je prends peut être le problème à l'envers...

    En fait je lis 6 fichiers de logs qui contiennent des wagons de lignes avec une date puis des données.
    Mon but étant d'afficher ces datas sur un graph chronologique je suis obligé d'afficher qu'une toute petite partie de mes données sur le graph en fonction de l’échelle des temps souhaitée ; ex j'ai 1 semaines de données, je n'affiche sur le graph que 1 heure et je change le contenu du graph quand je me déplace sur l’échelle des temps.
    C'est ces rechargements du graph qui prennent 10 plombes puisque en fonction de mon échelle des temps je vais rechercher dans les fichiers la ligne à partir de laquelle commencer et ca prend beaucoup de temps à priori.

    Peut être que je m'y prends mal pour aller chercher dans le fichier la première ligne à afficher !
    Les dates étant chronologiques mais pas régulières, comment puis-je m'y prendre autrement qu'en recherchant depuis le début ?

    Merci

  5. #5
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Dans ce cas, il faudrait peut être implémenter un algorithme de recherche qui soit plus performant. Un truc genre diviser pour régner sera déjà beaucoup plus rapide !

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,


    Citation Envoyé par petitours
    En fait je lis 6 fichiers de logs qui contiennent des wagons de lignes avec une date puis des données.
    Est-ce que tu parallélises les lectures des différents fichiers (utilisation de thread) ?

    Citation Envoyé par petitours
    C'est ces rechargements du graph qui prennent 10 plombes puisque en fonction de mon échelle des temps je vais rechercher dans les fichiers la ligne à partir de laquelle commencer et ca prend beaucoup de temps à priori.
    Tu ne pourrais pas garder en mémoire tes données (l'intégralité des logs) pour ne pas relire tes fichiers à chaque fois ? Il faut bien sur que tu crées une structure adaptée, mais ce sera plus rapide d'accéder aux données en cache que d'aller relire les fichiers à chaque fois.

  7. #7
    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 : 42
    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
    Puisque les données sont chronologiques, tu pourrais faire une recherche dichotomique... Mais c'est pas évident du tout à faire dans un fichier texte, vu qu'à chaque fois il faut chercher le début de la ligne (sauf si toutes les lignes font la même longueur, dans ce cas ça simplifie un peu le problème)

    Le plus simple, c'est de charger toute la liste en mémoire, et d'utiliser la méthode BinarySearch pour trouver la date que tu veux ; mais ça peut être problématique si le volume de données est important.

    Une autre solution envisageable : remplir une base de données avec les données du fichier, puis travailler sur cette base. Avec un index sur la date, ça devrait être assez performant.

  8. #8
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 969
    Points : 2 115
    Points
    2 115
    Par défaut
    Merci a tous pour vos idées, je suis en train de les explorer (je suis un peu long pour taper du code qui fait ce que je veux...) Je vous tiens au jus.

    Charger tous les fichier en mémoire je ne sais pas si je peux me permettre. Pour le moment la somme des 6 fichiers CSV arrive à 350Mo et je pourrai à l'avenir atteindre plus que ca à priori !
    Apres je peux aussi travailler sur des grandes portions de mes fichiers peut être : prendre un trés gros bout en mémoire mais pas tout.

    Merci

  9. #9
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Salut, vu la problématique, pourquoi tu ne passe pas par une base de donnée ?

    Tu interroge la base en fonction de la date et tu récupère les résultats toujours lignes après ligne avec un IDbDataReader ?

    Du coup ca modifierait pas trop ton algo et qui plus est, la majorité des BDD a des outils pour importer le contenu d'un csv

  10. #10
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 969
    Points : 2 115
    Points
    2 115
    Par défaut
    Salut

    En base de donnée je connais que Visual basique sous access... J'espère pour les gens qui font de la base de donnée que c'est la pire des expériences possibles tellement VB est mal foutu !
    Du coup je visualise assez mal à quoi peut ressembler mon affaire avec une base de donnée...

    Il faut avoir un moteur de BDD non ? Cela peut tourner et se déployer simplement avec C# ?

    Merci

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Tu peux embarquer une base SQL Compact Edition, ça n'ajoute que quelques DLL à ton projet.

    Pour l'utilisation, tu devrais commencer par les tutoriels disponibles sur le site, tu y verras plus clair.

  12. #12
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Ben, rien ne t'empeche de passer sous access, après, pour y acceder, ca va etre un simple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Pour du sqlServer :
    IDbConnection connection = new SqlConnection();
    connection.ConnectionString = "LaConnectionStringPourMaBase";
    IDbCommand command = connection.CreateCommand();
    command.CommandText = "marequete";
    IDataReader reader = command.ExecuteReader();
    while(reader.Read())
    {
            // Je récupère l'équivalent de ma "ligne" et j'ai déjà mes infos de filtrées par la requete
    }
    Avantage, si tu veux travailler avec de l'odbc, tu n'a qu'a remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IDbConnection connection = new SqlConnection();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IDbConnection connection = new OdbcConnection();
    ou si tu veux utiliser SQLLite, tu peux remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IDbConnection connection = new SQLiteConnection();
    je te laisse voir pour les autres providers^^

Discussions similaires

  1. [AC-2000] Suppression lignes sur fichier CSV depuis Access
    Par electronedf dans le forum VBA Access
    Réponses: 8
    Dernier message: 25/10/2010, 13h35
  2. tri sur fichier CSV
    Par Mouadlib dans le forum Langage
    Réponses: 2
    Dernier message: 17/12/2009, 09h33
  3. symbole decimal sur fichier CSV
    Par looping dans le forum Langage
    Réponses: 3
    Dernier message: 19/01/2009, 12h06
  4. Ecriture sur fichier csv
    Par PIMPMAX dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 09/01/2007, 11h55

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