Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2186 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1011247
jepoirrier
Posté le 13-03-2005 à 15:48:15  profilanswer
 

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
mood
Publicité
Posté le 13-03-2005 à 15:48:15  profilanswer
 

n°1011251
Taz
bisounours-codeur
Posté le 13-03-2005 à 15:58:00  profilanswer
 

utilise ArrayList

n°1011346
jepoirrier
Posté le 13-03-2005 à 17:44:32  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
Attacher 1 table Access à 1 fichier Excel avec mot de passelecture d'un fichier wav en C
Tronquer un nombre sous Matlabconnaitre la taille d'un fichier
[algo] algo non recursif pour parcourir les niveaux d'un arbrecomment insérer plusieurs tables à partir d'un fichier texte
comment tester si un nombre est un entierFaire une macro sur excel pour transformer Fichier Word
Rajouté un nouveau champ facilement (dans fichier et base de donnée) 
Plus de sujets relatifs à : [C#] connaitre le nombre de ligne sans parcourir fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR