cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDernière intervention 8 avril 2009
-
20 mars 2009 à 10:35
cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDerniè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 !!!
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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+",...");
}
DavidWhitewater
Messages postés81Date d'inscriptionlundi 10 avril 2006StatutMembreDerniè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();
Vous n’avez pas trouvé la réponse que vous recherchez ?
DavidWhitewater
Messages postés81Date d'inscriptionlundi 10 avril 2006StatutMembreDerniè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();
DavidWhitewater
Messages postés81Date d'inscriptionlundi 10 avril 2006StatutMembreDerniè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();
DavidWhitewater
Messages postés81Date d'inscriptionlundi 10 avril 2006StatutMembreDerniè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).
cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDerniè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");
}
}
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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)
cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDerniè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 !
cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDerniè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]);
}
}
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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 ?
cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDerniè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 ;)
cs_Stargirlfr
Messages postés25Date d'inscriptionmardi 13 mars 2007StatutMembreDerniè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 !