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

Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
- - Dernière réponse : cs_Stargirlfr
Messages postés
25
Date d'inscription
mardi 13 mars 2007
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 !!!
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
3
Merci
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()) ;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de krimog
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
3
Merci
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()) ;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de krimog
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Dernière intervention
15 avril 2013
0
Merci
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

}

   
Commenter la réponse de ed73
Messages postés
81
Date d'inscription
lundi 10 avril 2006
Dernière intervention
1 janvier 2010
0
Merci
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();
Commenter la réponse de DavidWhitewater
Messages postés
81
Date d'inscription
lundi 10 avril 2006
Dernière intervention
1 janvier 2010
0
Merci
Wouah, bonjour la mise en page !!!
Est-ce parce que j'utilise IE8 ou bien ???
Commenter la réponse de DavidWhitewater
Messages postés
81
Date d'inscription
lundi 10 avril 2006
Dernière intervention
1 janvier 2010
0
Merci
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();
Commenter la réponse de DavidWhitewater
Messages postés
81
Date d'inscription
lundi 10 avril 2006
Dernière intervention
1 janvier 2010
0
Merci
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();
Commenter la réponse de DavidWhitewater
Messages postés
81
Date d'inscription
lundi 10 avril 2006
Dernière intervention
1 janvier 2010
0
Merci
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).
Commenter la réponse de DavidWhitewater
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
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");
}
}
Commenter la réponse de cs_Stargirlfr
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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()) ;
Commenter la réponse de krimog
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
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");
}
}
Commenter la réponse de cs_Stargirlfr
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
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 !
Commenter la réponse de cs_Stargirlfr
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
Oups ! == et non =...

for(int i = 0 ; i < 15 ; i++)
{
     if (tab[i, 4] == "1")
     {
          textBox1.AppendText("" + tab[i,4]);
     }
}
Commenter la réponse de cs_Stargirlfr
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
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]);
     }
}
Commenter la réponse de cs_Stargirlfr
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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()) ;
Commenter la réponse de krimog
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
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 !
Commenter la réponse de cs_Stargirlfr
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
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 !
Commenter la réponse de cs_Stargirlfr
Messages postés
25
Date d'inscription
mardi 13 mars 2007
Dernière intervention
8 avril 2009
0
Merci
Merci infiniment =)
Bonne soirée !
Commenter la réponse de cs_Stargirlfr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.