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 :

Modification boucle extraction dans fichier text


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 Modification boucle extraction dans fichier text
    Bonjour à tous,

    J'aurai besoin d'aide pour modifier une procédure d'extraction d'information dans un fichier txt formaté par des delimiteurs.

    J'utilise le code ci-dessous (simplifié) qui 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
     
    try
                    {
                        Thread.Sleep(1000);
                        String[] files = Directory.GetFiles(SourcePath + "\\", "*" + FileType, SearchOption.TopDirectoryOnly);
                        foreach (String file in files)
                        {
     
                                string[] lines = File.ReadAllLines(file);
                                string fileDest = DestPath + "\\" + "Convert_" + Path.GetFileName(file);
     
                                using (StreamWriter sw = new StreamWriter( fileDest))
                                {
                                    foreach (string line in lines)
                                    {  
                                        var segments = line.Split(Convert.ToChar(Service1.FieldDelimiter));
     
    // BLABLA                                                                     
     
                                        sw.WriteLine(segments[a-1] + "|" + segments[b-1] + "|" + segments[c-1] + "|" + segments[d-1] + "|" + datefinal + "|" + heurefinal + "|" +segments[g-1] + "|" + segments [h-1]);
     
                                    }
                                }
     
     
                                File.Move(file, AppDomain.CurrentDomain.BaseDirectory + "\\Log\\" + new FileInfo(file).Name);
    Cependant ce code prend en compte toutes les lignes du fichier txt mais j'ai certain cas ou je ne souhaiterai pas prendre en compte la premiere ligne de chaque fichier (cas ou le fichier comporte des entête).

    Du coup dans mon fichier de configuration j'ai ajouté une option pour prendre en compte ou non la présence d'une entête sur les fichiers. Par contre je ne sais pas comment modifier mon code pour rendre en compte cette option.

    Je ne pense pas pouvoir rester sur une boucle "foreach" pour faire ce que je veux. Si?

    Une piste pour modifier mon code?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Tout d'abord comment est l’entête? Est-il toujours le même ou a-t-il une structure différente pour chaque fichier?

    Sinon on peut faire ce que tu veux de plusieurs manières:

    1. on conserve le foreach et on vérifie pour chaque ligne qu'il ne s'agit pas d'un entete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (string line in lines)
    {  
    if( line != entete)
    {
    var segments = line.Split(Convert.ToChar(Service1.FieldDelimiter));
     // BLABLA                                                                     
     sw.WriteLine(segments[a-1] + "|" + segments[b-1] + "|" + segments[c-1] + "|" + segments[d-1] + "|" + datefinal + "|" + heurefinal + "|" +segments[g-1] + "|" + segments [h-1]);
     }
    }
    perso je pense pas que je ferai comme ca puisque je vérifie avec une condition pour chaque ligne.

    2. ce que je ferai est de vérifier si la première ligne est un entete et de commencer le parcours de chaque ligne à partir de la deuxième avec un for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string[] lines = File.ReadAllLines(file);
     
    int i = 0;
    if(lines[0] = entete) i = 1;
     
    for(i ; i<lines.Count; i+)
    {
    var segments = lines[i].Split(Convert.ToChar(Service1.FieldDelimiter));
    // BLABLA                                                                     
    sw.WriteLine(segments[a-1] + "|" + segments[b-1] + "|" + segments[c-1] + "|" + segments[d-1] + "|" + datefinal + "|" + heurefinal + "|" +segments[g-1] + "|" + segments [h-1]); 
    }
    3. on peut également vérifier si le premier élément du tableau des lignes est un entete et le supprimer avant le traitement par un foreach
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string[] lines = File.ReadAllLines(file);
     
    if(lines[0] = entete) myArray.RemoveAt(0); //supprimele premier élement
     
    //traitement avec foreach conservé
    foreach (string line in lines)
    {  
    var segments = line.Split(Convert.ToChar(Service1.FieldDelimiter));
     // BLABLA                                                                     
     sw.WriteLine(segments[a-1] + "|" + segments[b-1] + "|" + segments[c-1] + "|" + segments[d-1] + "|" + datefinal + "|" + heurefinal + "|" +segments[g-1] + "|" + segments [h-1]);
    }

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string[] lines = File.ReadAllLines(file);
    if (entetepresente)
    {
      lines  = lines.skip(1).ToArray();
    }
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    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
    bonjour a tous

    en fait l'entete est variable en fonction du type de fichier manipulé. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    systeme|ID|Result|Com
    AAAA|1|10.2|truc
    AAAA|1|23.2|bidule
    BBBB|2|12|machin
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID|Result|Com|syteme|Autre
    1|10.2|truc|AAAA|dfs
    1|23.2|bidule|AAAA|ssd
    2|12|mac|BBBB|eer
    En gros, s'il y a une entête, celle-ci est toujours présente sur tout les fichiers manipulés. Par contre d'une configuration à l'autre, cette entête peut varier (nom des champs, nombre de champs). Seule chose commune quand l'entête est présente c'est un retour à la ligne.

    La seule chose "constante" est qu'en fonction de l'utilisation et donc du paramétrage, tout les fichiers ont tous une entête ou alors tous non pas d'entête. Je defini cela dans le fichier config avant de commencer a manipuler les fichiers.

    Du coup, je pense que le plus simple c'est de ne pas analyser cette premiere ligne pour savoir si c'est une entête ou non mais de faire "confiance" au paramètrage. Si mon option de parametrage "HEADER" est sur:
    - YES > j'ignore systématiquement la premiere ligne de chaque fichier
    - NO > je prend en compte la premiere ligne

    J'espère avoir été clair dans mes explications.

  5. #5
    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
    du coup un truc du genre vous semble correct?

    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
     
     
    try
                    {
                        Thread.Sleep(1000);
                        String[] files = Directory.GetFiles(SourcePath + "\\", "*" + FileType, SearchOption.TopDirectoryOnly);
                        foreach (String file in files)
                        {
     
                                string[] lines = File.ReadAllLines(file);
                                string fileDest = DestPath + "\\" + "Convert_" + Path.GetFileName(file);
     
    // Modification                            
    if (Service1.Header == "YES") lines  = lines.skip(1).ToArray();
    //                           
     
                                using (StreamWriter sw = new StreamWriter( fileDest))
                                {
                                    foreach (string line in lines)
                                    {  
                                        var segments = line.Split(Convert.ToChar(Service1.FieldDelimiter));
     
    // BLABLA                                                                     
     
                                        sw.WriteLine(segments[a-1] + "|" + segments[b-1] + "|" + segments[c-1] + "|" + segments[d-1] + "|" + datefinal + "|" + heurefinal + "|" +segments[g-1] + "|" + segments [h-1]);
     
                                    }
                                }
     
     
                                File.Move(file, AppDomain.CurrentDomain.BaseDirectory + "\\Log\\" + new FileInfo(file).Name);
    EDIT: bon la fonction .skip ou .RemoveAt n'existe pas sur mon tableau lines....

  6. #6
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    apparement array.removeat() n'est valable que pour javascript.

    et en essayant ca (non testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    List<string> listeLignes = File.ReadAllLines(file).ToList();
     
    // Modification                            
    if (Service1.Header == "YES") listeLignes  = listeLignes.RemoveAt(0);
     
    using (StreamWriter sw = new StreamWriter( fileDest))
    {
    foreach (string line in listeLignes)
    {  
     
    Suite du code....
    Maintenant que je vois la structure des fichier je remarque que l'entete contient que des lettres mais que les lignes suivantes contiennent également des chiffres. On pourrait donc envisager de fair la vérification automatiquement si il y a ou non des entete par la présence ou non de chiffre sur la première ligne.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2015, 09h35
  2. [fichier_texte]Modif nombres dans fichier texte
    Par begginner dans le forum VBA Word
    Réponses: 3
    Dernier message: 22/07/2010, 23h23
  3. Extraction donnees et insertion dans fichier texte
    Par BobDesign dans le forum PL/SQL
    Réponses: 1
    Dernier message: 06/03/2009, 16h41
  4. Insertion dans fichier texte + rapide que TStringList ?
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 26/02/2004, 11h34

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