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 :

Renseignement Programme csharp


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut Renseignement Programme csharp
    Bonjour à tous,

    Je suis actuellement en train de créer un petit logiciel avec Visual basic 2010 en c Sharp. J'ai déjà créer une première partie du programme qui me permet de récupérer des données et de créer un fichier texte de la façon suivante :

    date ; heure début ; heure fin; temps total; nom ; age ; .......
    Par jour il faut compter que j'ai 10 lignes qui se rajoute dans mon fichier.

    Mon petit soucis c'est que maintenant de doit trier le fichier texte par rapport à la date, aux noms, et par rapport aux heures, j'ai +- réussi à le faire, mais le programme est énorme et prend pas mal de temps pour réaliser cette recherche.

    Avez une autres idée pour réaliser "ce triage", auraît il était préférable de créer un autre fichier qu'un fichier texte ?


    Deuxième petit problème, en créant le logiciel j'ai voulu l'installer sur une machine avec Windows 2000, au point de départ l'ordinateur n'avez pas de librairy MSCOREE.DLL j'ai télécharger le fichier , puis j'ai télécharger Framework mais pas moyen de faire fonctionner mon logiciel :-( Avez vous une idée, ou faut 'il que j'essaie d'installer visual studio ?


    Merci

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    Le choix du fichier texte est mauvais mais il n'influe pas sur les performances. La seule raison qui fait qu'il est mauvais c'est que ça t'a demandé beaucoup de boulot inutile alors qu'il existait beaucoup plus simple.

    Deux bonnes possibilités :
    * Un fichier XML, en passant par XmlSerializer : C# va tout faire pour toi, tu n'as quasiment aucun code de lecture/écriture à écrire.
    * Une base de données SQL Compact (base de données dite embarquée : c'est un simple fichier, pas besoin de déployer un serveur SQL sur le poste). Tu crées la DB, le code est généré automatiquement et prendra en charge la lecture, l'écriture et même le tri.
    Les deux solutions demandent à peine quelques minutes pour un connaisseur.


    Maintenant, concernant le tri, comment le réalises-tu ? Car si c'est bien fait, le tri de 100k entrées sera instantané aux yeux de l'utilisateur. En particulier : tout doit être en mémoire avant, on ne doit réécrire le fichier qu'à la fin, il faut tout réécrire d'un coup et non pas modifier certaines parties, le tri doit utiliser un algo type Quicksort (complexité O(n.log(n)), ce qui est le cas si on passe par Array.Sort ou List.Sort. Qui plus est on peut sans doute se contenter de trier en mémoire et ne pas chercher à modifier le fichier.

    Enfin, concernant le déploiement, VS est inutile en soi. Il suffit de distribuer la version release (et non pas debug) et s'assurer que la bonne version du framework (pas forcément la plus récente) est installée sur la machine.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Bonjour.

    Le choix du fichier texte est mauvais mais il n'influe pas sur les performances. La seule raison qui fait qu'il est mauvais c'est que ça t'a demandé beaucoup de boulot inutile alors qu'il existait beaucoup plus simple.

    Deux bonnes possibilités :
    * Un fichier XML, en passant par XmlSerializer : C# va tout faire pour toi, tu n'as quasiment aucun code de lecture/écriture à écrire.
    * Une base de données SQL Compact (base de données dite embarquée : c'est un simple fichier, pas besoin de déployer un serveur SQL sur le poste). Tu crées la DB, le code est généré automatiquement et prendra en charge la lecture, l'écriture et même le tri.
    Les deux solutions demandent à peine quelques minutes pour un connaisseur.


    Maintenant, concernant le tri, comment le réalises-tu ? Car si c'est bien fait, le tri de 100k entrées sera instantané aux yeux de l'utilisateur. En particulier : tout doit être en mémoire avant, on ne doit réécrire le fichier qu'à la fin, il faut tout réécrire d'un coup et non pas modifier certaines parties, le tri doit utiliser un algo type Quicksort (complexité O(n.log(n)), ce qui est le cas si on passe par Array.Sort ou List.Sort. Qui plus est on peut sans doute se contenter de trier en mémoire et ne pas chercher à modifier le fichier.

    Enfin, concernant le déploiement, VS est inutile en soi. Il suffit de distribuer la version release (et non pas debug) et s'assurer que la bonne version du framework (pas forcément la plus récente) est installée sur la machine.

    Merci pour la réponse, je vais essayer de réaliser une des deux solutions que vous m'avez conseillé

    En fait lorsque j'ai essayer de télécharger Frameword, j'ai eu le message d'erreur WIN32 n'est pas d'application, concernant le logiciel il a été compilé avec la version release.

    Concernant le tri, il faut dire que je me suis un peu emmêler, malgrès que j'arrive au bon résultat je veux le prendre le plus simple, d'ou la questions que je vous ai poser.

    EN fait j'ai un interface qui demande à l'utilisateur de sélectionner une date et un nom , (dans mon programme je lit a chaque fois toute les lignes du fichier == long) une fois récuprer la ligne il doit les afficher dans un label par exemple et parfois si il y a deux lignes comportant le meme nom et la même date il faut les additionner, en suite une fois toute les donnée récupérer j'envoie toutes les données dans un formulaire Excel (que l'on m'impose) afin de sortir d'imprimer le résultat et de sortir les graphique

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par xavvdb003 Voir le message
    En fait lorsque j'ai essayer de télécharger Frameword, j'ai eu le message d'erreur WIN32 n'est pas d'application, concernant le logiciel il a été compilé avec la version release.
    Cela ressemble à un problème de corruption du fichier lors du téléchargement, il suffit peut-être de retenter.

    EN fait j'ai un interface qui demande à l'utilisateur de sélectionner une date et un nom , (dans mon programme je lit a chaque fois toute les lignes du fichier == long)
    Je pense qu'il serait plus judicieux de lire les données au chargement de l'application et de les maintenir en mémoire par la suite. On crée un modèle représentant les entrées du fichier et l'ensemble de ces entrées, celui-ci reste toujours en mémoire et toute modification faîte à ce modèle est répercutée sur le fichier ou la DB. C'est ce qui sera généré automatiquement avec une DB et Linq to SQL par exemple.

    Cela dit, il n'est pas normal que quelques milliers d'entrées soient longues à lire. Je soupçonne un mauvais usage des chaînes de caractère.


    @Reward
    En réalité la solution XML revient à faire exactement ce que tu suggères.
    XmlSerializer ne demande pas de parser manuellement le fichier XML : typiquement on crée une classe comme la tienne, on ajoute un ou deux attributs et celle-ci sera sérialisée automatiquement. Qui plus est utiliser Linq To Objects n'adresse par les problèmes de performance ni de sérialisation, c'est simplement une façon commode de travailler avec les objets, qui sera disponible quelle que soit la solution retenue.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Cela ressemble à un problème de corruption du fichier lors du téléchargement, il suffit peut-être de retenter.


    Je pense qu'il serait plus judicieux de lire les données au chargement de l'application et de les maintenir en mémoire par la suite. On crée un modèle représentant les entrées du fichier et l'ensemble de ces entrées, celui-ci reste toujours en mémoire et toute modification faîte à ce modèle est répercutée sur le fichier ou la DB. C'est ce qui sera généré automatiquement avec une DB et Linq to SQL par exemple.

    Cela dit, il n'est pas normal que quelques milliers d'entrées soient longues à lire. Je soupçonne un mauvais usage des chaînes de caractère.
    Citation Envoyé par Reward Voir le message
    Bonjour,

    J'ai une solution à te proposer pour ton fichier texte. Pour effectuer simplement un tri selon les critères que tu souhaites, je te propose d'utiliser Linq To Object.

    Pour ce faire, tu vas créer une classe qui sera le miroir d'une ligne de ton fichier, à savoir:
    date ; heure début ; heure fin; temps total; nom ; age ; etc....

    Tu fais donc une classe du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Enregistrement
        {
            public DateTime date  {get;set;}
            public DateTime heureDebut {get;set;}
            public DateTime heureFin {get;set;}
            public TimeSpan tempsTotal {get;set;}
            public string nom {get;set;}
            public int age {get;set;}
        }
    Lorsque tu lis une ligne de ton fichier, tu fais un Split dessus (String.Split), en décomposant ta ligne, tu seras capable d'affecter à chaque propriété ci-dessus la valeur correspondante.

    Donc pour une ligne lue et splitée, tu vas créer un nouvel objet.

    Chaque objet ainsi créé est enfin ajouté à une liste (List<Enregistrement>).

    Tu pourras ainsi requêter sur la liste avec la fonction OrderBy et en choisissant ton critère, exemple:
    liste.OrderBy(e => e.age) pour classer en fonction de l'âge.

    Cette solution a le mérite d'être simple à mettre en place et de respecter ton choix du fichier texte.

    La solution basée sur le Xml de DonQuiche peut être pas mal, mais revient au final à faire la même chose pour les critères. Ca sera par contre beaucoup plus verbeux, donc volumineux.

    Par contre, à plus long terme, sa solution basée sur SQL Server CE est une bonne solution pour te permettre un requêtage plus puissant, mais son implémentation étant un peu plus compliquée, cela reste à voir en fonction de to niveau.
    Je vous remercie pour vos conseils, je vous tiens au courant de l'avancement de mon travail

  6. #6
    Membre éprouvé

    Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2004
    Messages : 178
    Par défaut
    Bonjour,

    J'ai une solution à te proposer pour ton fichier texte. Pour effectuer simplement un tri selon les critères que tu souhaites, je te propose d'utiliser Linq To Object.

    Pour ce faire, tu vas créer une classe qui sera le miroir d'une ligne de ton fichier, à savoir:
    date ; heure début ; heure fin; temps total; nom ; age ; etc....

    Tu fais donc une classe du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Enregistrement
        {
            public DateTime date  {get;set;}
            public DateTime heureDebut {get;set;}
            public DateTime heureFin {get;set;}
            public TimeSpan tempsTotal {get;set;}
            public string nom {get;set;}
            public int age {get;set;}
        }
    Lorsque tu lis une ligne de ton fichier, tu fais un Split dessus (String.Split), en décomposant ta ligne, tu seras capable d'affecter à chaque propriété ci-dessus la valeur correspondante.

    Donc pour une ligne lue et splitée, tu vas créer un nouvel objet.

    Chaque objet ainsi créé est enfin ajouté à une liste (List<Enregistrement>).

    Tu pourras ainsi requêter sur la liste avec la fonction OrderBy et en choisissant ton critère, exemple:
    liste.OrderBy(e => e.age) pour classer en fonction de l'âge.

    Cette solution a le mérite d'être simple à mettre en place et de respecter ton choix du fichier texte.

    La solution basée sur le Xml de DonQuiche peut être pas mal, mais revient au final à faire la même chose pour les critères. Ca sera par contre beaucoup plus verbeux, donc volumineux.

    Par contre, à plus long terme, sa solution basée sur SQL Server CE est une bonne solution pour te permettre un requêtage plus puissant, mais son implémentation étant un peu plus compliquée, cela reste à voir en fonction de to niveau.

Discussions similaires

  1. Exercice de programmation en Csharp
    Par thomasdu73 dans le forum C#
    Réponses: 3
    Dernier message: 06/11/2013, 09h16
  2. Renseigner par programmation un Formulaire
    Par Gerard_L dans le forum Windows
    Réponses: 4
    Dernier message: 30/08/2010, 11h58
  3. Réponses: 3
    Dernier message: 24/07/2009, 15h24
  4. Probleme sur un programme en Csharp
    Par zambo dans le forum C#
    Réponses: 9
    Dernier message: 20/04/2007, 11h57
  5. Nouvelle en programmation, besoin de renseignements
    Par Shtootchka dans le forum C++
    Réponses: 8
    Dernier message: 03/12/2005, 10h27

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