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 :

Fichier plat à découper : Quelle techno utiliser ? DataGrid ? DataTable ? List<T>


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut Fichier plat à découper : Quelle techno utiliser ? DataGrid ? DataTable ? List<T>
    Bonjour à tous


    Je fais face à une interrogation sur un choix à faire en .Net / C#.

    Je souhaite faire un programme permettant de lire un fichier "plat" contenant des données.
    Concrètement, ce fichier serait un fichier ASCII/Texte qui contiendrait des données séparées par un séparateur, disons une tabulation pour le moment.

    Mon but serait de charger ce fichier en mémoire et d'avoir un accès "facile" à mes données découpées.
    Mon but serait de pouvoir faire des agrégations sur ce fichier.

    Exemple tout simple, imaginons un fichier plat qui contient des écritures comptables ( en gros, une colonne "Numero de compte", une autre "debit", une autre "credit").

    Je souhaiterais pas exemple que toutes les lignes avec le même compte soit fussionnées en une seule ligne, avec le débit de sommé. Et une autre ligne avec le crédit sommé. Ce qu'on appelle donc une "agrégation".

    N'ayant pas non plus une grosse expérience en .Net, ( même si j'ai quelques applis à mon actif), je me demande quoi utiliser pour stocker mon fichier découpé, et surtout pour pouvoir faire des manipulation façile ( ma fameuse agrégation).

    -Charger le fichier dans un DataGrid ?
    -Charger le fichier dans un DataTable ?
    -Charger le fichier dans un flux mémoire XML ? ( même si c'est un fichier plat ?)
    -Charger le fichier dans une liste <T> ?

    A noter quelques contraintes ( oui, sinon c'est pas drôle ).

    Mon programme devrait être paramétrable, c'est à dire, que devrais pouvoir lui donner un fichier avec des colonnes supplémentaires ( donc je ne peux "pas" faire un code "statique", il doit être dynamique).

    En plus de cela, je pourrais être amené , à, en plus de traiter des fichiers avec des séparateurs, des fichiers XML, mais, aussi....des fichiers TEXTES avec longueurs fixes...

    Dans le cas de la longueur fixe, forcément il faudra que je spécifie mon mappage, nous sommes d'accord.

    Dans ce cas...et afin de faire de la manipulation facilement...Dans quoi chargeriez vous mon fichier ?

    -Charger le fichier dans un DataGrid ?
    -Charger le fichier dans un DataTable ?
    -Charger le fichier dans un flux mémoire XML ? ( même si c'est un fichier plat ?)
    -Charger le fichier dans une liste <T> ?

    Merci à tous ceux qui ont pris le temps de lire mon message
    N'hésitez pas si il y a des questions

    Merci à tous

    Nix

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Tu devrais utiliser Excel tu t'épargneras beaucoup de travail

    Pour faire du générique tu vas vraiment te casser la tête...
    La piste de la datatable n'est pas mauvaise en créant des Providers qui te permettront d'absorber différents types de fichiers (csv avec le séparateur en variable par exemple)
    En premier lieu fais une datatable qu'avec de colonnes string. Tu l'affiches; tu demandes à l'utilisateur de typer chaque colonne (string, Datetime, float, int etc..) et après en fonction du type tu peux imaginer des fonctions sommes, moyenne etc...
    Après pour le somme avec le groupby sur une colonne (nom de compte) avec du générique c'est pas super simple mais ça se fait; peut-être le lien suivant
    http://www.codeproject.com/Questions...-with-group-by

    Après franchement le mieux si tu connais ta structure tu fais une classe Entree { numCompte, Date, Debit } et là tu peux faire ce que tu veux facilement avec une List<Entree> sans trop en demander à l'utilisateur. Sinon tu as la première méthode mais ça ressemble à Excel

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Hello,

    Je ne peux pas utiliser Excel car le but serait au final d'avoir un programme console dans lequel je lui passerait en argument un fichier de "paramétrage". Ce fichier contiendrait le chemin de mon fichier en entrée, et celui de sortie, le type de fichier, le séparateur et sur quoi sommer.

    Le but est que ce programme soit lancé via une automatisation. C'est pas du manuel, pas du one shot, donc je ne peux pas prendre Excel.

    Oui, une liste<T> serait bien...si mon, fichier était toujours le même, sauf que je risque d'avoir entre 7 et 10 fichiers...différents.

    Si j'arrive déja a tout parser dans un DataTable ce serait déja un bon boulot je pense. Ensuite, on peut utiliser Linq sur un DataTable ? Ou c'est mieux directement de charger mon fichier ( même texte) dans un XML en mémoire...ça revient peux être au même au fond.

    Encore merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bah, tu pourrais avoir un fichier qui décrit tes colonnes, avec type et action autorisée (somme, par exemple)

    et ensuite, dans ton programme, tu charges en mémoire tes données dans un tableau et tu pourras ensuite faire les sommes, ou autre en fonction
    des actions autorisés par ton fichier de description...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Tout à fait, c'est le but en gros, avoir un fichier contenant des paramètres, et mon programme lit ces paramètres et fait ce qu'il a à faire.

    Tu dis : Stocker dans un tableau.
    Alors, justement, ce serait pas un peu trop "oldschool" d'utiliser un tableau ? Car il va falloir manipuler les indexs, ne serait il pas plus simple de bosser sur un DataTable ou sinon je pensais à une chose peux être plus "smart" : Une list<T> d'un objet objet généré via un ORM de type Entity framework.

    Je n'ai jamais utilisé Entity Framework, mais c'est bien à cela que ca sert ? En gros, ça permet de créer dynamiquement un objet ?
    Qu'en penses tu?

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Si tu veux utiliser les listes le plus simple est de faire une liste (ligne) de liste (colonne) d'objet (la donnée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<List<object>> data= new List<List<object>>();
    Mais le DataTable semble plus adapté.
    - Tu peux créer des colonnes de type objet, les remplir et tenter de définir le type après (un clone + typage en faite)
    - Ou garder le type objet et jouer sur les cast lors de tes requêtes.
    - Tenter le type var si il est permit.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Mmm et dans ce cas, il serait possible de faire du Full Dynamique ? Ou du entity framework serait mieux ?

    Dis voir...si tu as excel sur ton pc, quand tu fais fichier+ouvrir et si tu prends le fichier d'une extension inconnu, il te propose un assistant d'import. Si tu choisi l'option "Fichier de taille fixe", on arrive sur une fenetre permettant de délimiter les colonnes. J'aimerais faire un peu dans ce style, pour rappel, ça ressemble à ça :



    J'éssaye un peu décomposer le truc, je pense qu'ils utilisent :

    Une TexteBox avec scrollbar pour le texte du fichier, mais pour la règle du dessus, je pensais a une textebox contenant la règle composée de caractères ascii.
    Je pense que la scrollbar horizontal de la textbox du fichier contrôle aussi la scrollbar (masquée ?) de la textebox contenant la règle non ?

    Qu'en penses tu ?

  8. #8
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 72
    Points : 135
    Points
    135
    Par défaut
    Salutation !

    Si je comprend bien, tu veux faire un programme Console utilisable dans un batch et paramétrable.
    Ce programme doit pouvoir lire un fichier .txt ainsi qu'un descriptif qui lui est associé.
    Ça m'a fait penser à un code que j'avais trouvé je ne sais plus où (je pense sur stackoverflow) pour lire le TRES gros fichier texte Allcountries.txt (1,28Go) et faire des requetes linq dessus.
    Je pense que c'est tout a fait adaptable à ton cas.

    Rectification : J'ai trouvé ce code dans le livre : "LINQ TO OBJECTS USING C# 4.0" de Troy Magennis ( http://www.amazon.com/Troy-Magennis/e/B00318V75A )
    Chapitre 9 (Parallel Linq to Objects), Listing 9-1, Page 232

    Voici le 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    using System;
    using System.IO;
    using System.Linq;
     
     
    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                const int nameColumn = 1;
                const int countryColumn = 8;
                const int elevationColumn = 15;
     
     
                var lines = File.ReadLines(Path.Combine(Environment.CurrentDirectory, @"AllCountries.txt"));
     
     
                var q = from line in lines                                                //.AsParallel()
                        let fields = line.Split(new char[] { '\t' })
                        let elevation = string.IsNullOrEmpty(fields[elevationColumn]) ? 0 : int.Parse(fields[elevationColumn])
                        where elevation > 8000
                        orderby elevation descending
                        select new
                        {
                            name = fields[nameColumn] ?? "",
                            elevation = elevation,
                            country = fields[countryColumn]
                        };
     
     
                int nbResult = 0;
                foreach (var x in q)
                {
                    if (x != null)
                    {
                        nbResult++;
                        Console.WriteLine("{0} ({1} m) -situé à {2}", x.name, x.elevation, x.country);
                    }
     
                }
                Console.WriteLine("Nombre de résultats = {0}", nbResult);
                Console.ReadLine();
            }
        }
    }
    Le but de ce programme était de démontrer la différence de charge des processeurs selon que l'on active .AsParallel()
    Plus rapide sans le AsParallel() sur mon ordi ( Intel Core i7 4710HQ à 3,2Ghz et 16Go de ram, données sur un Disque dur Sata, gain d'une seconde sur un SSD ).
    13 secondes pour obtenir le résultat en mode debug. Bon, j'ai pas testé tout les cas de figures, c'est le linq qui m'intéressais ! :p

    Dans ton cas, tu constateras que :
    - On y traite les données séparées par un caratère Tab '\t' facilement remplaçable par un ';'
    - Le fichier traité est (pour un fichier texte) énorme. ( Je l'ai récupéré ici -> http://download.geonames.org/export/dump/ )
    - on y utilise 'var' pour stocker les données.
    - On utilise linq pour traiter les données.
    - Il est tout petit.

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je ne connais pas vraiment C#, mais si cela peut servir. En, principe, cela donne des champs. Quant à savoir ce que cela donne vraiment et si tu peux l'utiliser pour ton problème, je ne suis pas assez connaissant en C#.

    https://dzone.com/articles/built-in-dotnet-csv-parser
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

Discussions similaires

  1. Quelle techno utiliser ?
    Par juujuu50 dans le forum Protocoles
    Réponses: 4
    Dernier message: 12/05/2014, 09h22
  2. Web mobile quelles technos utiliser ?
    Par bedomon dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 02/10/2013, 15h48
  3. Quelles technos utiliser pour un site web
    Par algabow dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 4
    Dernier message: 24/12/2011, 01h40
  4. Quelle techno utiliser pour faire une appli de gestion
    Par zaz147 dans le forum Général Java
    Réponses: 5
    Dernier message: 09/12/2010, 17h14
  5. Quelle techno utiliser pour mon site ?
    Par Horse_pyro dans le forum Général Conception Web
    Réponses: 8
    Dernier message: 27/03/2007, 16h54

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