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 :

Parser un fichier délimité [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut Parser un fichier délimité
    Bonjour à tous,

    J'aurai besoin de votre aide pour développer mon petite appli.

    Mon petit prog doit lire des fichiers text qui se présente ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    xxx|rrrr|dsdf|gfgdfg|ghfjhy|fgqgg
    jthd|qffqd|dfsd|qfqf|qqfsdf|hfhfh
    Ces fichiers vont de 1 ligne à x ligne. Je souhaite récupérer chaque champs de chaque ligne et le mettre dans un tableau pour pouvoir le retraiter par la suite.

    Je ne sais pas du tout faire cela, mais après avoir parcouru le net, je pense que la solution est un streamreader

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using (StreamReader str = StreamReader(file))
    {
    // récupérer chaque ligne du fichier
    string[] str = File.ReadAllLines(file);
    // création de la data table
    DataTable dt = new DataTable();
    // remplissage du datatable
    ....
    }
    Mais après cela je suis bloqué....

    Un peu d'aide serait la bienvenue.

    Merci

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Effectivement, le StreamReader permet de récupérer l'ensemble des lignes, sous la forme d'un tableau de String.

    Maintenant, il reste à séparer chaque élément de chaque ligne. Pour cela, il existe la méthode String.Split, qui permet de découper une chaîne de caractères en fonction d'un séparateur. Et c'est exactement ce qu'il faut ici, avec '|' en guise de séparateur.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    Bon je viens de faire quelques essais... pas très concluant vu mon faible niveau en programmation.

    J'ai fait cela:

    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
     
    DataTable dt = new DataTable();
                                int x;
                                x = Convert.ToInt32(Service1.NumberOfFields);
                                dt.Columns.AddRange(new DataColumn[x]);
                                List<string> list = new List<string>();
     
                                using (StreamReader sr = new StreamReader(file))
                                {
                                    while (sr.Peek() >= 0)
                                    {
                                        list.Add(sr.ReadLine());
                                    }             
                                }
                                for (int i = 0; i < list.Count; i++)
                                {
                                    var segments = list[i].Split(Convert.ToChar(Service1.FieldDelimiter)); 
                                    foreach (var segment in segments)
                                    {
     
                                        dt.Columns.Add(segment);
     
                                    }
     
                                }
                                StreamWriter sw = new StreamWriter("test" + file);
                                foreach (DataRow row in dt.Rows)
                                {
                                    foreach (object item in row.ItemArray)
                                    {
                                        sw.Write((string)item + "\t");
                                    }
                                    sw.WriteLine();
                                }
    En gros pour le moment je cherche a mettre les lignes de mon fichier dans un dataset grace à un streamreader, puis a retransferer ce dataset vers un fichier text avec un streamwriter.

    Par le suite je modifierai la partie streamwriter pour n'utiliser que certains champs... mais chaque chose en son temps.

    Pour en revenir à mon code, je pense que l'endroit ou ça merdouille c'est l'ajout des infos dans le dataset.

    Un peu d'aide?

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par waspy59 Voir le message
    Pour en revenir à mon code, je pense que l'endroit ou ça merdouille c'est l'ajout des infos dans le dataset.
    Il serait bon de nous dire ce qui merdouille ! Nous n'avons pas de boule de cristal

    Bon, en regardant le code, j'ai constaté que tu n'ajoutais pas de ligne dans ton DataTable. Il existe la méthode DataTable.NewRow() pour créer une nouvelle ligne.

    A l'heure actuelle, tu ne fais qu'ajouter des colonnes. Il est donc normal que tu n'aies aucunes données.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Par défaut
    hello

    merci pour la piste mais je dois être une cruche... j'y arrive pas.

    quand le mouline le fichier suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    322|56000837|OCR19023|CQMUL3|2016-11-23|12:04:20|174.1|TGP[1]|
    323|56000838|OCR19023|CQMUL3|2016-11-23|12:04:29|686.5|LDH[1]|
    311|56000839|OCR19023|CQMUL3|2016-11-23|12:04:30|85.91|P[1]|
    304|56000834|OCR19023|CQMUL3|2016-11-23|12:04:26|2.486|TG[1]|
    Mon service plante sur la deuxieme ligne au niveau de la colonne "OCR19023" avec l'erreur "Une colonne nommée 'OCR19023' appartient déjà à ce DataTable".

    Voici le code que j'utilise:

    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
     
    DataTable dt = new DataTable();
                                DataColumn column;
                                DataRow row; 
                                int x;
                                x = Convert.ToInt32(Service1.NumberOfFields);
                                dt.Columns.AddRange(new DataColumn[x]);
                                List<string> list = new List<string>();
     
                                using (StreamReader sr = new StreamReader(file))
                                {
                                    while (sr.Peek() >= 0)
                                    {
                                        list.Add(sr.ReadLine());
                                    }
     
                                }
                                for (int i = 0; i < list.Count; i++)
                                {
                                    row = dt.NewRow();
                                    dt.Rows.Add(row); 
                                    var segments = list[i].Split(Convert.ToChar(Service1.FieldDelimiter));
     
                                    foreach (var segment in segments)
                                    {
     
                                        dt.Columns.Add(segment);
     
                                    }
     
                                }
                                StreamWriter sw = new StreamWriter("test" + file);
                                foreach (DataRow row2 in dt.Rows)
                                {
                                    foreach (object item in row2.ItemArray)
                                    {
                                        sw.Write((string)item + "\t");
                                    }
                                    sw.WriteLine();
                                }
    Je me demande si le dataset est une bonne solution car apparemment il faut mettre des entêtes de colonnes. Dans mon cas il serait peut-être plus simple d'utiliser un tableau?
    en effet, une fois le tableau rempli, je veux récupérer certains champs de chaque ligne du tableau, et reconstruire un fichier text ligne par ligne à partir des champ qui m'interesse... suis-je clair?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SAX] parser un fichier xml en Java
    Par royou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/02/2005, 17h12
  2. parser un fichier .dtd
    Par bgranou dans le forum Valider
    Réponses: 2
    Dernier message: 04/06/2004, 19h53
  3. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08
  4. parser un fichier avec xerces
    Par traiangueul dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 02/02/2004, 18h14
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 17h53

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