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 :

Regex Split fichier .txt pour remplir un Datatable


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Regex Split fichier .txt pour remplir un Datatable
    Bonsoir a tous,

    Je cherche une aide pour un affichage dans une datagridview. Je m'explique : j'ai un fichier texte du type

    blabla | blabla2 | element1 | AB:CD| blabla3
    blabla | blabla2 | element2 | ABC | blabla3
    blabla | blabla2 | element3 | 123 | blabla3

    Ce que je souhaiterais obtenir :

    Nom : O0rbE.png
Affichages : 175
Taille : 2,8 Ko


    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
    string[] myenum = Enum.GetNames(typeof(allenum));
    DataTable dt = new DataTable();
    foreach (string enum in myenum)
    {
        string[] lines = File.ReadAllLines(files);
        foreach (var line in lines)
        {
            string[] items = line.Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);
            DataRow row = dt.NewRow();
            if (!line.Contains(enum)) continue; 
                row[items[2]] = items[3];
            dt.Rows.Add(row);
        }
    }
    dgVResult.DataSource = dt;

    ce que j'obtiens avec le code ci dessus :

    Nom : byMri.png
Affichages : 195
Taille : 3,5 Ko


    les seules donées qui m'interesse dans le fichier texte sont :

    blabla | blabla2 | element1 | AB:CD| blabla3
    blabla | blabla2 | element2 | ABC | blabla3
    blabla | blabla2 | element3 | 123 | blabla3


    Merci

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Le raisonnement suggère que la ligne
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRow row=dt.NewRow();
    doit être placée devant le boucle foreach (string enum in myenum) et après la ligne DataTable dt=new DataTable(); bien entendu; et que la ligne doit être placée après le boucle foreach (string enum in myenum) et devant la ligne dgVResult.DataSource=dt. Voilà !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    merci ça fonctionne !

    juste une chose, est il possible de garder cette méthode pour plusieurs fichiers ?
    pour un fichier ça fonctionne parfaitement.

    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
    public void trifichiers(string[] files)
            {
                string[] myenum = Enum.GetNames(typeof(allenum));
                DataTable dt = new DataTable();
     
                DataRow row = dt.NewRow();
     
                foreach (string enum in myenum)
                {
                    dt.Columns.Add(enum); // je crée les en-tetes à l'aide de l'enum
                    foreach (string file in files)
                    {
                        string[] lines = File.ReadAllLines(file);
                        foreach (var line in lines)
                        {
                            char[] delimiter = { '|' };
                            string[] elements = line.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
     
                            if (!line.Contains(enum)) continue;
     
                            row[elements[2]] = elements[3];
                        }
                    }
                }
                dt.Rows.Add((row));
                dgVResult.DataSource = dt;
            }

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    juste une chose, est il possible de garder cette méthode pour plusieurs fichiers ?
    Oui, mais l'esquisse montrée n'est pas correcte. Je vais la réarranger pour que la logique se soit conduite correctement. Mais il y a des soucis que je ne sens pas confortable.
    [1] enum est un mot-clé, je pense il ne faut pas se l'employé comme le nom d'une variable.
    [2] Les données délimitées par |, soit, ok, comment vous voulez. Mais les espaces devant et après sont en danger de cassé en matchant le nom des colonnes... Peut-être vous avez arrangé bien ça, mais c'est assez hasardeux.
    [3] Le critère !line.Contains(enum) est presque insensé; si ça ne casse pas, c'est par une bonne chance. Si une donnée de nom de la colonne était "paselement1", ça va conduire la fonction d'ajouter les données au DataRow et ça va résulter une erreur. On peut imaginer beaucoup de cas pour casser la fonctionnalité. Non, c'est bien fragile. Il faut absolument l'améliorer fortement après.
    [4] Il n'y a pas de raison a priori que le fichier nécessairement donne au moins un data matché le nom de colonne. Pour les cas comme ça, il ne faut pas faire exécuter la ligne dt.Rows.Add(row). Je mets un critère concis pour ça mais vous devrez ajouter using System.Linq pour le faire marcher. On peut facilement imaginer les autres façons de faire la même, mais probablement en plus de lignes que montrée. J'y mets cette façon de faire pour m'amuser, c'est tout.

    Voilà ce qu'il faut faire en réarranger les lignes. (Vous remettez le style que vous préférez, bien sûr.)
    Code c# : 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
    public void trifichiers(string[] files) {
        string[] myenum = Enum.GetNames(typeof(allenum));
        DataTable dt = new DataTable();
        DataTable dt = new DataTable();
        foreach (string senum in myenum) {    //renommé senum
            dt.Columns.Add(senum);
        }
        foreach (String file in files) {
            DataRow row = dt.NewRow();
            string[] lines = File.ReadAllLines(file);
            foreach (var line in lines) {
                char[] delimiter = { '|' };
                string[] elements = line.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
                foreach (string senum in myenum) {    //même note
                if (!line.Contains(senum)) continue;
                row[elements[2].Trim()] = elements[3].Trim();
            }
        }
     
        if (!row.ItemArray.All(i => i is DBNull)) {    //ajouter using System.Linq;
            dt.Rows.Add(row);
        }
     
        //etc quelque travail pas montré avec dt comme on veut...
     
    }

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci ! effectivement avant le traitement je fait appel à une fonction permettant de supprimé tout les espaces contenus dans les fichiers à l'aide du regex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public void DeleteSpace(string file)
            {
                string[] lines = File.ReadAllLines(file);
                using (StreamWriter sw = new StreamWriter(file))
                {
                    foreach (string line in lines)
                    {
                        if (!string.IsNullOrEmpty(line) && line.Length > 1)
                        {
                            sw.WriteLine(Regex.Replace(line, @"\s+", ""));
                        }
                    }
                }
            }

    Je vais essayer de rendre le code plus costaud pour éviter tout problèmes
    Merci encore

Discussions similaires

  1. rename "regex-rule" file
    Par nounou0018 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 06/04/2011, 16h17
  2. [decouverte] regex split différents resultats selon le browser
    Par hornetbzz dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/03/2010, 10h02
  3. Catch des DUMP pour Export file TXT.
    Par 19cmos83 dans le forum SAP
    Réponses: 1
    Dernier message: 24/09/2009, 15h16
  4. [RegEx] split en fonction des espace en excluant les portion entre quotes
    Par Invité dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/06/2009, 16h58
  5. export d'un onglet en file.txt
    Par Siocn dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/07/2008, 16h29

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