jepoirrier | 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 :
- int i; // variable temporaire de comptage
- int ncol; // Nombre de colonnes
- int nlignes; // Nombre de lignes
- i = 0; // Initialisation initiale :-)
- FileStream fs = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.None);
- StreamReader sr = new StreamReader(fs);
- string s = sr.ReadLine(); // Lit la première ligne
- nlignes = 1;
- // Recherche du nombre de colonnes, en comptant le nombre d'espaces
- Regex exp = new Regex(@"\s", RegexOptions.Compiled); // definit une expression
- MatchCollection matchList = exp.Matches(s); // matche l'expression sur la chaine s
- ncol = matchList.Count; // compte le nombre d'occurences de l'espace
- Console.WriteLine("Nombre de colonnes : " + ncol.ToString());
- // Parcours du fichier à la recherche du nombre de lignes
- // Je n'ai pas trouvé comment faire autrement car, sur un fichier texte
- // de 137 Mo, parcourir 2 fois, c'est lourd !
- while(s != null)
- {
- s = sr.ReadLine();
- nlignes++;
- }
- sr.Close(); // Fermeture du Stream
- fs.Close(); // Fermeture du fichier
- // Création du tableau des données (floats)
- float[][] f = new float[nlignes][ncol];
- // On recommence sur le fichier ; ce n'est pas tres optimisé ...
- FileStream fs = new FileStream("data.dat", FileMode.Open, FileAccess.Read, FileShare.None);
- StreamReader sr = new StreamReader(fs);
- string s = sr.ReadLine(); // Lit la première ligne
- etc.
|
Message édité par jepoirrier le 13-03-2005 à 15:49:50 ---------------
http://www.poirrier.be
|