[C#] Sauvergarder mot par mot d'un fichier txt dans un tableau

Résolu
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009 - 20 mars 2009 à 10:35
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009 - 20 mars 2009 à 20:18
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 (un mot correspondrait à une case) 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 ?
J'ai fait quelques recherches mais n'ai trouvé la solution à mon problème...
Merci par avance !!!

18 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
20 mars 2009 à 11:30
Salut

Il y a quelques points qui ne vont pas dans ta fonction. Tout d'abord, "while (ligne != null)", ligne ne change jamais, donc boucle infinie ;)

Pour ta fonctions, tu devrais plutôt faire
StreamReader reader = new StreamReader("C:\\monfichier.txt");
string ligne;
string[,] tab = new string[15, 4]; // C'est plus logique dans ce sens

ligne = reader.ReadLine();
for (int i = 0; ligne != null; i++)  // Pour chaque ligne
{
    string[] sousTab = ligne.Split(' '); // On récupère les 4 éléments dans un tableau
    for (int j = 0; j < 4; j++)
    {
        tab[i,j] = sousTab[j]; // On remplit le tableau
    }
    ligne = reader.ReadLine(); // On passe à la ligne suivante
}

Krimog :
while (!succeed = try()) ;
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
20 mars 2009 à 17:11
StreamReader reader = new StreamReader("C:\\monfichier.txt");
string ligne;

ligne = reader.ReadLine();
for (int i = 0; ligne != null; i++)  // Pour chaque ligne
{
    string[] sousTab = ligne.Split(' '); // On récupère les 4 éléments dans un tableau
    Employee emp = new Employee();
    emp.Number = int.Parse(sousTab[0]);
    emp.FName = sousTab[1];
    emp.LName = sousTab[2];
    emp.Service = int.Parse(sousTab[0]);
    listEmp.Add(emp);
    ligne = reader.ReadLine(); // On passe à la ligne suivante
}

Mais attention : ça ne marche que si tu as mis des propriétés en écriture dans ta classe :
public int Number
{
    get { return _number; }
    set { _number = value; }
}

Et après, pour lire :
foreach (Employee emp in listEmp)
{
    Console.WriteLine("Num : "+emp.Number+", First Name : "+emp.FName+", Last Name : "+emp.LName+", Service : "+emp.Service);
}
ou si tu n'es pas à l'aise avec un foreach (et tu aurais bien tord, c'est super pratique)
for (int i = 0 ; i < listEmp.Count ; i++)
{
    Console.WriteLine("Num : "+listEmp[i].Number+",...");
}

Krimog :
while (!succeed = try()) ;
3
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
20 mars 2009 à 11:26
Là tu ne lis qu'une ligne et tu boucles indéfiniment !

Voici un exemple pour te donner une idée, à toi de l'adapter à tes besoins

String str;

while((ligne = reader.ReadLine()) != null)
{
str = ligne.Split(' ');

// str est alors un tableau de 4 chaînes

}

   
0
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
20 mars 2009 à 11:31
Salut,

System.IO.StreamReader reader = new System.IO.StreamReader(@"c:\fichier.txt");
string[,] tab = new string[4, 15];
char separator = ' ';
string line;
string[] splitTab;

for (int index = 0; index < 15; index++)
{
line = reader.ReadLine();
splitTab = line.Split(separator);
for (int i = 0; i < 4; i++)
{
tab[i, index] = splitTab[i];
}
}
reader.Close();
0

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

Posez votre question
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
20 mars 2009 à 11:33
Wouah, bonjour la mise en page !!!
Est-ce parce que j'utilise IE8 ou bien ???
0
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
20 mars 2009 à 11:35
Et qu'est ce que ca donne en "mode de compatibilité" ?

System.IO.StreamReader reader = new System.IO.StreamReader(@"c:\fichier.txt");
string[,] tab = new string[4, 15];
char separator = ' ';
string line;
string[] splitTab;

for (int index = 0; index < 15; index++)
{
line = reader.ReadLine();
splitTab = line.Split(separator);
for (int i = 0; i < 4; i++)
{
tab[i, index] = splitTab[i];
}
}
reader.Close();
0
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
20 mars 2009 à 11:38
Et qu'est ce que ca donne en "mode de compatibilité" et rechargé la page ?

System.IO.StreamReader reader = new System.IO.StreamReader(@"c:\fichier.txt");
string[,] tab = new string[4, 15];
char separator = ' ';
string line;
string[] splitTab;
 
for (int index = 0; index < 15; index++)

      line = reader.ReadLine(); 
      splitTab = line.Split(separator);
      for (int i = 0; i < 4; i++) 
         {
             tab[i, index] = splitTab[i]; 
         }
}
reader.Close();
0
DavidWhitewater Messages postés 81 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 1 janvier 2010
20 mars 2009 à 11:40
On aura pas mieux...

Donc pour info, pour répondre avec IE8 final release, il faut afficher la page en mode compatibilité (si vous avez une toute petite textbox pour rentrer votre texte : rechargez la page).
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 12:00
OK, super, merci infiniment pour vos réponses. Effectivement, j'avais oublié d'incrémenter la ligne ^^ !!

J'en profite pour vous poser une autre question : en ce qui concerne l'affichage (je voudrais vérifier que la fonction marche bien), j'ai ça (mais ça me met "L'index se trouve en dehors des limites du tableau") :

// Affichage du tableau
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 15; j++)
{
textBox1.AppendText(tab[i,j]);
textBox1.AppendText("\n");
}
}
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
20 mars 2009 à 12:15
Attention, si tu utilises mon code, j'ai inversé les dimensions !!
(ça me semblait plus logique de choisir d'abord la personne puis la donnée que tu souhaite avoir)

Krimog :
while (!succeed = try()) ;
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 12:23
Euh, oui, pardon, j'ai bien fait dans le bon sens :

// Affichage du tableau
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 4; j++)
{
textBox1.AppendText(tab[i,j]);
textBox1.AppendText("\n");
}
}
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 13:02
Je souhaitais éditer mon précédent message, mais impossible de trouver comment faire... Je pose donc ma nouvelle question dans un nouveau message :





Je souhaite afficher uniquement les lignes où la dernière variable est égale à 1 (par exemple). J'ai codé ça :



for(int i = 0 ; i < 15 ; i++)
{
     if (tab[i, 4] = 1)
     {
          textBox1.AppendText("" + tab[i,4]);
     }
}




Cependant, il me fait une erreur " impossible de convertir implicitement le type int en string ". Ce que je comprends.
Du coup, je mets des "1" mais là, c'est : "impossible de convertir implicitement le type string en bool".
Euh, mon erreur est certainement bête, mais... je ne vois pas comment lui faire comprendre que 1 est un string (j'ai même essayé les côtes ' mais "impossible de convertir implicitement le type char en string").

Je m'emmêle les pinceaux là =/ !!!
Encore merci pour votre aide !
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 13:14
Oups ! == et non =...

for(int i = 0 ; i < 15 ; i++)
{
     if (tab[i, 4] == "1")
     {
          textBox1.AppendText("" + tab[i,4]);
     }
}
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 13:35
Je pensais avoir trouvé mais... ça me mets toujours "L'index se trouve en dehors des limites du tableau"
J'ai mis l'index 3 à la place de 4 (car les cases sont 0, 1, 2 et 3... donc, pas de case 4) mais... ça ne change rien
Une idée svp ?



for(int i = 0 ; i < 15 ; i++)
{
     if (tab[i, 3] == "1")
     {
          textBox1.AppendText("" + tab[i,3]);
     }
}
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
20 mars 2009 à 14:01
Salut.


En mode debug, lors de l'exception, as-tu vérifié que ton tableau était
bien rempli ? (il suffit de mettre ta souris sur le code (le tableau,
en l'occurrence au moment où l'exception est levée). Quelles sont les
valeurs de i et j ? Est-tu bien sûre qu'il y a 15 lignes dans ton
fichier source ?

Krimog :
while (!succeed = try()) ;
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 15:40
i = 15
j = 4

Ça c'est bon.
En fait, je me suis trompée, je n'ai pas pris le problème dans le bon sens. Il faut coder orienté objet. Donc, au lieu de faire un tableau à 2 dimensions, je dois utiliser des lists.

Désolée du dérangement... Je vous tiens au courant ;)

Encore merci pour ton aide krimog !
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 16:38
Modification du sujet : Je souhaite maintenant récupérer les données d'un fichier txt dans une list (et plus dans un tab)... =/

Ma classe a été créé et est fonctionnelle et contient les éléments suivants :

class Employee
    {
        private int _number;       
        private String _fname;   
        private String _lname;  
        private int _service;

        private List _app = new List ();
        private List <Vacation> _vac = new List <Vacation>();

// ... (constructeur...) //

     }

// Création d'une nouvelle liste :
List listEmp = new List();

Comment puis-je récupérer élément par élément pour les mettre dans ma liste ? Puis-je toujours utiliser Streamreader ?
Merci d'avance pour votre aide !
0
cs_Stargirlfr Messages postés 25 Date d'inscription mardi 13 mars 2007 Statut Membre Dernière intervention 8 avril 2009
20 mars 2009 à 20:18
Merci infiniment =)
Bonne soirée !
0