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 :

PRoblème de lecture et récupération de données dans un fichier texte [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut PRoblème de lecture et récupération de données dans un fichier texte
    Bonjour à tous,
    j'ai un petit soucis dans mon programme que j'ai débuté.
    Le but est le suivant :
    en entrée je sélectionne un fichier texte en sortie je dois récupérer un fichier excel.

    Dans un premier temps, je choisi mon fichier texte, puis quand je clique sur le bouton "Traitement", je parcours mon fichier texte, voici un exemple de mon 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
     
            private void btn_start_ficExcel_Click(object sender, EventArgs e)
            {
                //1 selection du fichier en entrée
     
     
                string FileToRead = txtbox_entree.Text;  //txtbox_entree.Text correspond au chemin de mon fichier texte
     
                string[] lines = File.ReadAllLines(FileToRead); //lecture du fichier
     
                int lenTab = 0;
                //recuperer la longueur du tableau pour les sirens, c'est à dire le nombre de siren dans mon fichier texte.
    /*
    j'ai mis en pièce jointe un échantillon pour illustrer mon exemple, dans mon fichier texte, le premier numéro de siren se trouve à la ligne 3, donc dans mon tableau c'est l'index 2.
    Le siren suivant ( siren n°2) se trouve à la ligne 17
    Dans un premier temps, dans mon code ci dessous, je lis mon fichier et je compte le nombre de siren, en incrémentant mon compteur de 13
    */
                for (int i = 0; i <= File.ReadAllLines(FileToRead).Length; i += 14)
                {
                    lenTab++;
                }
     
                string[] Tabsiren = new string[lenTab];  //j'initialise mon tableau
     
                //récupération des sirens
     
    //ici j'essaye de parcourir les lignes et dans tabsiren, je souhaite avoir toute la liste des sirens présente dans mon fichier, donc à la ligne 3, 17, 31 etc..
    // mais je n'y arrive pas, soit j'ai des cases vide soit il me prend toutes les données de chaque lignes.
                for (int j=0; j<= File.ReadAllLines(FileToRead).Length;j++)
                {
                   // for (int k = 2; k <= File.ReadAllLines(FileToRead).Length; k+=14)
                   // {
                        Tabsiren[j] = lines[j].Substring(6, 9);
     
                  //  }                 
                }
     
    }
    le principe est qu'une fois que j'ai récupéré la liste des sirens dans un tableau, j'initialise la connexion à la base de données, puis je ferais une boucle, avec un select pour récupérer toutes les informations que je souhaite en fonction du sirend et ensuite je constituerais un fichier excel.

    Merci pour votre aide .
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Si tu sais que le premier SIREN est sur la ligne 3 (indice 2) et que les autres sont toutes les 14 lignes, pourquoi commencer à 0 ?
    Et Pourquoi lire deux fois le fichier ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    Bonjour,
    depuis hier j'ai modifié mon codage, dont voici la descritpion :


    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
     
                string[] lines = File.ReadAllLines(FileToRead); //lecture du fichier
     
                int lenTab = 0;
                int compteur = 0;
     
                //recuperer la longueur du tableau pour les siren
                for (int i = 0; i <= File.ReadAllLines(FileToRead).Length; i++)
                {
                    lenTab++;
                }
     
                //lenTab =43
     
                string[] Tabsiren = new string[lenTab];
     
                MessageBox.Show("lenTab: " + lenTab.ToString()); //lenTab +43
                MessageBox.Show("Nombre de ligne du fichier: " + File.ReadAllLines(FileToRead).Length.ToString());  //NB DE LIGNE 42
     
                try
                {
                    for (int j = 0; j <= lenTab; j++)  
                    {
     
                        Tabsiren[compteur] = lines[j].Substring(6, 9);
                        compteur = compteur + 1;      
     
                    }
                }
                catch (Exception monerreur)
                {
     
                    MessageBox.Show(monerreur.ToString());
                }
    pour répondre à votre question, je ne commence pas à 2 car l'index 0 et 1 seront à null.
    En modificant mon code, je parcours chaque ligne de mon fichier et j'enregistre chaque ligne dans mon tableau, comme je sais que chaque siren se trouvent toutes les 14 lignes.

    Ensuite , je créé un autre tableau dans lequel je vais récupérer que les sirens se trouvant dans mon 1er tableau (tabsiren)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                string[] ListeSiren = new string[lenTab];
                int compteurTab = 0;
     
                for (int i = 2; i <= Tabsiren.Length; i++) 
                           //je commence à l'index 2, comme je sais que le 1er siren se trouve à l'index 2 de mon 1er tableau et j'incremente mon compteur i de 1
                {
                    ListeSiren[compteurTab] = Tabsiren[i];
                    i = i + 13;
                    compteurTab = compteurTab + 1;                
                }
    Vous trouverez en pièce jointe le tableau que j'obtiens " tableau listsiren" dans lequel j'ai mes 3 sirens se trouvant à l'index 0, 1 et 2 ( mon fichire test disposant de 42 ligne).
    Les fichiers finaux disposeront d'environ 600 ou 700 lignes, là j'essaye de trouver le moyen de faire en sorte que le tableau listSiren ne contiennent que les siren présent dans le fichier et soit de la bonne taille, pour éviter d'avoir des valeurs nulls.
    Contrairement à mon premier poste je pense que là ça doit être plus optimisé car je ne le lis qu'une fois le fichier.


    Merci
    Images attachées Images attachées  

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Ceci est inutile car lenTab sera égal à File.ReadAllLines(FileToRead).Length, sans compter que là aussi tu relis le fichier alors que as déjà son contenu dans lines.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     for (int i = 0; i <= File.ReadAllLines(FileToRead).Length; i++)
    {
        lenTab++;
    }
    C'est non seulement inutile et contre-productif. Mais c'est également faux puisque tu n'as pas 43 SIREN mais seulement 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //lenTab =43
    string[] Tabsiren = new string[lenTab];
    Ce qui explique pourquoi tu te retrouves avec 40 valeurs nulles dans ton tableau final.
    Tu plantes parce que tu lis les lignes de 0 à 43 (à cause du inférieur ou égal) alors que le dernier indice est à 42.

    Donc là, tu lis le fichier 2 fois au lieu de 3 (j'en avais oublié une tout à l'heure) et en plus tu boucle dessus 2 fois.
    Tu as donc 4 itérations (au lieu de 6 comme tout à l'heure) alors qu'une seule suffit.

    Donc pour être efficace.
    1. Déclarer un tableau de longueur 3 (nombre de lignes de ton fichier (43) divisé par 14), ou directement une List<String> comme ça tu n'a pas à te préoccuper de sa taille.
    2. Faire une seule boucle qui commence à partir de 2 jusqu'à la fin avec un pas de 14
    3. Et dans cette unique boucle extraire les SIREN

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String[] lines = File.ReadAllLines("data.txt");
    List<String> sirens = new List<String>();
    for (Int32 index = 2; index < lines.Count(); index+=14)
    {
        sirens.Add(lines[index].Substring(6, 9));
    }

  6. #6
    Membre éprouvé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2013
    Messages
    976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 976
    Par défaut
    bonjour Popo,

    merci pour ton aide, il est génial ton code, je comprend mieux .
    J'ai tenté de m'inspiré de List<string> mais je n'ai jamais pratiqué.

    merci *

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2012, 14h48
  2. récupération de données dans un fichier texte
    Par capucine1983 dans le forum Langage
    Réponses: 4
    Dernier message: 30/06/2007, 00h16
  3. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54
  4. Réponses: 16
    Dernier message: 10/11/2005, 21h10
  5. Réponses: 6
    Dernier message: 23/10/2005, 12h24

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