[C#] connaitre le nombre de ligne sans parcourir fichier

connaitre le nombre de ligne sans parcourir fichier [C#] - C#/.NET managed - Programmation

Marsh Posté le 13-03-2005 à 15:48:15    

Bonjour,
J'écris un petit programme en C# (le langage m'est imposé) qui doit ouvrir un fichier texte contenant x colonnes de nombres flottants (séparés par des espaces), sur y lignes. A priori, personne ne connait ces nombres x et y. La solution que j'ai trouvée nécessite :
- une ouverture du fichier (on compte les colonnes sur la première ligne avec une expression régulière)
- un premier parcours de ce fichier pour compter le nombre de lignes
- une fermeture du fichier
- une ouverture du fichier
- un second parcours du fichier pour peupler le tableau aux bonnes dimensions x et y
- une fermeture du fichier
 
Est-ce qu'il n'y a pas moyen de faire plus simple et d'éviter de parcourir 2 fois le fichier ? Car, sur des petits fichiers, 2 parcours sont vite réalisés ; mais quand le fichier fait 137 Mo ...
 
Un grand merci d'avance.
Jean-Etienne
 
Pour ceux que çà intéresse, voici le code actuel :

Code :
  1. int i; // variable temporaire de comptage
  2. int ncol; // Nombre de colonnes
  3. int nlignes; // Nombre de lignes
  4. i = 0; // Initialisation initiale :-)
  5. FileStream fs = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.None);
  6. StreamReader sr = new StreamReader(fs);
  7. string s = sr.ReadLine(); // Lit la première ligne
  8. nlignes = 1;
  9. // Recherche du nombre de colonnes, en comptant le nombre d'espaces
  10. Regex exp = new Regex(@"\s", RegexOptions.Compiled); // definit une expression
  11. MatchCollection matchList = exp.Matches(s); // matche l'expression sur la chaine s
  12. ncol = matchList.Count; // compte le nombre d'occurences de l'espace
  13. Console.WriteLine("Nombre de colonnes : " + ncol.ToString());
  14. // Parcours du fichier à la recherche du nombre de lignes
  15. // Je n'ai pas trouvé comment faire autrement car, sur un fichier texte
  16. //    de 137 Mo, parcourir 2 fois, c'est lourd !
  17. while(s != null)
  18. {
  19. s = sr.ReadLine();
  20. nlignes++;
  21. }
  22. sr.Close(); // Fermeture du Stream
  23. fs.Close(); // Fermeture du fichier
  24. // Création du tableau des données (floats)
  25. float[][] f = new float[nlignes][ncol];
  26. // On recommence sur le fichier ; ce n'est pas tres optimisé ...  
  27. FileStream fs = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.None);
  28. StreamReader sr = new StreamReader(fs);
  29. string s = sr.ReadLine(); // Lit la première ligne
  30. etc.


Message édité par jepoirrier le 13-03-2005 à 15:49:50

---------------
http://www.poirrier.be
Reply

Marsh Posté le 13-03-2005 à 15:48:15   

Reply

Marsh Posté le 13-03-2005 à 15:58:00    

utilise ArrayList

Reply

Marsh Posté le 13-03-2005 à 17:44:32    

Taz a écrit :

utilise ArrayList

Je n'y avais pas pensé mais je ne sais pas trop bien comment les utiliser pour stocker plusieurs colonnes dans la même ArrayList. Si je n'avais qu'un vecteur, j'aurais pu écrire :

Code :
  1. ArrayList al = new ArrayList();
  2. al.add(1); // ajout de ma première valeur
  3. al.add(3.14); // ajout de ma seconde valeur


Mais comment faire pour faire quelque chose qui ressemble à ceci :

Code :
  1. double[,] f = new double[nlignes,ncol];
  2. for(i = 0; i < nlignes - 1; i++) // -1 sinon il prend la nlignes+1 car part de zero !
  3. {
  4. s = sr.ReadLine();
  5. string[] difval = r.Split(s, ncol);
  6. for(j = 0; j < ncol; j++)
  7. {
  8.  f[i, j] = Convert.ToDouble(difval[j]);
  9. } // Fin du parcours de toutes les colonnes pour chaque ligne
  10. } // Fin du parcours de toutes les lignes


Un grand merci pour ton aide.
Jean-Etienne


---------------
http://www.poirrier.be
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed