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#

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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 éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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 éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    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?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si c'est toi qui a choisit le dataset sans raison apparente, je confirme que ce n'est surement pas la meilleure solution
    mais tu veux en faire quoi de ton fichier au final ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Si l'objectif est de créer un fichier avec seulement certaines des colonnes, alors il est inutile de passer par un DataTable (surtout que tu ne sembles pas en comprendre la différence entre colonnes et lignes).

    Voici un exemple de code qui devrait te permettre de faire ce que tu souhaites (enfin, si j'ai bien compris le besoin !)
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int x = Convert.ToInt32(Service1.NumberOfFields);
    string[] lines = File.ReadAllLines(file);
     
    using(StreamWriter sw = new StreamWriter("test" + file))
    {
       foreach (string line in lines)
       {
          var segments = line.Split(Convert.ToChar(Service1.FieldDelimiter));
          sw.WriteLine(String.Format("{0}\t{1}\t{2}", segments[0], segments[2], segments[4]));
       }
    }

    La seule chose qu'il te reste à faire, c'est de modifier la ligne sw.WriteLine afin de ne tenir compte que des champs qui t'intéressent. Dans mon exemple, j'ai gardé les champs à l'index 0 (=le premier), 2 (=le troisième) et 4 (=le cinquème).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    @Francois: Merci beaucoup, c'est exactement ce que je voulais faire (en beaucoup plus simple que mon histoire de dataset )

    Encore merci de votre aide à tous.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 40
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par waspy59 Voir le message
    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".
    Tiens un fichier de QC d'analyseur de Laboratoire ;-)
    Bros

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    bien vu ;-)

+ 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