[C#] Récupérer mots de .txt et save dans tab

Fermé
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 - 19 mars 2009 à 17:00
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 - 20 mars 2009 à 22:45
Bonjour,

Je débute en C# et aurais besoin de votre aide. Je travaille sous Visual Studio.
Mon problème est le suivant :

J'ai un fichier texte qui comporte des informations de la façon suivante :
[numéro] [nom] [prénom] [service]

Par exemple : 1 Dupont Martin 3

Je souhaiterais récupérer ces informations et les enregistrer dans un tableau pour pouvoir les manipuler plus facilement après.

J'ai codé cette fonction, mais cela ne marche pas... Je ne sais pas vraiment comment utiliser la fonction "Split(' ')" qui me permettrait de récupérer chaque mot (séparé par un espace) et de l'enregistrer dans le tableau à 2 dimensions (tab[i,j] où i représenterait les colonnes, au nombre de 4 et j les lignes, au nombre de 15).

private void saveTxtFileInTab()
        {
            try
            {
                StreamReader reader = new StreamReader("C:\\monfichier.txt");
                string ligne = reader.ReadLine();
                
                string[,] tab = new string[4,15];

                // Lecture de toutes les lignes
                while (ligne != null)
                {
                    // COLONNES (N° - NOM - PRENOM - SERVICE)
                    for (int i = 0 ; i < 4 ; i++)
                    {
                        // LIGNES (1 à 15)
                        for (int j = 0; j < 15; j++)
                        {
                            tab[i, j] = ligne;
                        }
                    }
                }

                // Fermeture du fichier
                reader.Close();

                // Affichage du tableau
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 15; j++)
                    {
                        textBox1.AppendText(tab[i,j]);
                    }
                }
            }
            catch (Exception ex)
            {
                // En cas d'exception / d'erreur : prévenir
                textBox1.AppendText("Exception: " + ex.Message + "\n");
            }
            finally
            {
                //textBox1.AppendText("Executing finally block" + "\n");
            }
        }



Pourriez-vous m'aider ?
Merci par avance !!!
A voir également:

7 réponses

halo_quebec Messages postés 161 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 9 juin 2010 10
20 mars 2009 à 13:56
tu pourrais essayer de faire une classe personnel et ensuite faire une liste generique de ta classe personnel(List<Personnel>), d'apres moi sa serai la meilleur façon,

cependant, si tu veut tjr faire un tableau 2d, tu peu utiliser cette methode pour lire ton fichier, ainsi que les 2 constante... La methode te retourne un tableau 2d de ton fichier texte(s'il a 4 colonne et moins que 15 ligne...)
sur ce, bonne chance


public const int NB_LIGNE = 15;
public const int NB_COLONNE = 4;

private string[,] lire()
{
StreamReader reader = new StreamReader("mr.txt");
string[,] tabString = new string[NB_COLONNE, NB_LIGNE];
string[] tabTemp;
int cptLigne = 0;
while (!reader.EndOfStream)
{
tabTemp = reader.ReadLine().Split(' ');
for (int index = 0; index < NB_COLONNE; index++)
{
tabString[index, cptLigne] = tabTemp[index];
}
cptLigne++;
}
return tabString;
}
0
halo_quebec Messages postés 161 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 9 juin 2010 10
20 mars 2009 à 13:59
si tavait de la difficulte avec ton code, c pcq tu faire ReadLine et tu l'utilisais comme s'il lisait le fichier au complet, alors que sa lit seulement la premiere ligne...
0
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
20 mars 2009 à 17:10
Oui, merci, en fait, j'ai trouvé la solution pour mon tableau (sur un autre forum).
Mais comme tu dis, il faut que j'utilise une list à la place... Mais du coup, je ne sais plus comment faire.

Voilà mon code, mais j'ai un problème "l'index se trouve en dehors des limites du tableau".
Sachant que ma classe Employee a bien été créé et compte 4 arguments (4 string).

try
            {
                StreamReader reader = new StreamReader("C:\\employees.txt");
                string ligne = reader.ReadLine();

                List<Employee> listEmp = new List<Employee>();
                
                while ((ligne = reader.ReadLine()) != null)
                {
                   string[] Items = ligne.Split(new char[] { ' ' });
                   listEmp.Add(new Employee(Items[0].Trim(), Items[1].Trim(), Items[2].Trim(), Items[3].Trim()));
                }

                reader.Close();

                // AFFICHAGE DE LA LISTE
                foreach (Employee emp in listEmp)
                {
                    textBox1.AppendText(emp.ToString());
                }
            }
            catch (Exception ex)
            {
                textBox1.AppendText("Exception: " + ex.Message + "\n");
            }
            finally
            {
                //textBox1.AppendText("Executing finally block" + "\n");
            }



MERCI d'avance pour votre aide !!!
0
halo_quebec Messages postés 161 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 9 juin 2010 10
20 mars 2009 à 19:22
au lieu de sa:


string ligne = reader.ReadLine();

List<Employee> listEmp = new List<Employee>();

while ((ligne = reader.ReadLine()) != null)
{
string[] Items = ligne.Split(new char[] { ' ' });
listEmp.Add(new Employee(Items[0].Trim(), Items[1].Trim(), Items[2].Trim(), Items[3].Trim()));
}

essay plutot

string[] tabTemp;
while (!reader.EndOfStream)
{
tabTemp = reader.ReadLine().Split(' ');

listEmp.Add(new Employee(tabTemp[0], tabTemp[1], tabTemp[2], tabTemp[3]));

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
20 mars 2009 à 19:55
Bon, en fait, j'ai fait ça et ça fonctionne. Enfin, pas tout à fait car il me manque le 1er élément qui n'est pas affiché (il m'affiche tout sauf la 1ère ligne... Bizarre !)
Encore merci pour ton aide halo_quebec !!!


while ((ligne = reader.ReadLine()) != null) 
                {
                   string[] Items = ligne.Split(' ');
                   if (Items.Length == 4)  listEmp.Add(new Employee(Items[0].Trim(), Items[1].Trim(), Items[2].Trim(), Items[3].Trim()));
                }

                reader.Close();
0
halo_quebec Messages postés 161 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 9 juin 2010 10
20 mars 2009 à 21:10
De rien, sa fait plaisir,
mais je me demandait, pourquoi tu utilise trim()??

et pour ta premiere ligne, si tu as toujours cette ligne:

string ligne = reader.ReadLine();

en haut de ton while, alors c normal...

tu lis une ligne et tu en lit une autre dans ton while(ligne = reader.ReadLine() != null)

alors la premiere fois, tu reecrit par dessu ta premier ligne avant de l'utiliser...
0
Stargirlfr Messages postés 1175 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 12 février 2017 356
20 mars 2009 à 22:45
Exact ! Merci !
Une autre question : comment comparer le 4ème élément de ma liste ?
Je m'explique : je souhaite afficher uniquement les employées où le 4ème élément est égal à 1.

Voilà ce que j'ai codé mais... il ne comprend pas le "&&" (je confonds avec le C ?)

while ((ligne = reader.ReadLine()) != null)
                    {
                        string[] Items = ligne.Split(' ');
                        if ((Items.Length == 4) && (Items[3].Trim() == "1"))
                        {
                            listEmp.Add(new Employee(Items[0].Trim(), Items[1].Trim(), Items[2].Trim(), Items[3].Trim()));
                        }
                    }


EDIT : j'avais oublié des parenthèses ! Ca fonctionne maintenant !!
0