Ecriture Multi - Fichiers [Résolu]

Signaler
Messages postés
8
Date d'inscription
lundi 22 décembre 2003
Statut
Membre
Dernière intervention
22 octobre 2007
-
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
-
Bonjour,

Je suis débutant en C#, je souhaite utiliser ce language pour parser mes fichiers de log, le principe est simple, je lis un gros fichier texte ligne par ligne, si la ligne répond à certains critères, je l'écris dans un fichier précis.

par exemple :
   ligne1 : vas dans fichier1
   ligne2 : vas dans fichier2
   ligne3 : vas dans fichier2
   ligne4 : vas dans fichier1
   ligne5 : vas dans fichier2

Je ne sais pas à l'avance combien de fichiers seront créés.

Principe : 
   boucle tant que fichier de log pas fini {
         lit ligne;
         si ligne contient fichier je récupère le numéro
         j'écris dans le fichier #numéro# (ouverture/création selon l'état du fichier)
   }
   je ferme tout les fichiers créés
   je ferme le fichier de log.

Pour le moment je boucle sans problème, par contre lorsque je dois écrire la ligne, je ne vois pas comment ouvrir (voir créer) le bon fichier et surtout ne pas refermé après chaque écriture mais bien en fin de traitement ...

Si je pouvais avoir des nom de variables dynamique, le problème serait réglé avec :

Si le stream n'existe pas encore : 
      if (! liste_status.Contains(status))
        {
         FileStream fstmp#icilenomdynamique#  = new FileStream(cheminDest + nomDuFichierSource + "_" + status + extensionDuFichierSource, FileMode.Create);
         StreamWriter swdest#icilenomdynamique# = new StreamWriter(fstmp#icilenomdynamique# );
         liste_status.Add(status);
        }

Je ne sais pas si je suis suffisament claire, n'hésitez pas à demander un complément d'information ....

2 réponses

Messages postés
134
Date d'inscription
dimanche 1 octobre 2006
Statut
Membre
Dernière intervention
19 mai 2008
1
Bonsoir,

Hum, si j'ai bien compris, pour chaque critère, tu écrit dans un fichier ?
Si c'est le cas, pourquoi ne pas stocker un Dictionnaire (Dictionnary<Key,Value>) dans lequel tu stock tous tes critères avec un nom comme clé, et le critère en question comme valeur.

Comme ca tu peux créer pour chaque critère un FileStream fs_cle_critere et un StreamWriter sw_cle_critere.

A partir de là tu pourra tester l'existance de ces 2 objets pour chacun de tes critère...

Sinon tu peux passer par une structure pourquoi pas :

struc Critere
{
      string critere;
      FileStream fs;
      StreamWriter sw;
      string filename;
}

Critere monCritere1 = new Critere();
monCritere1.critere = "blabla";
monCritere1.filename = "path vers le fichier";
monCritere1.fs = new FileStream(filename);
monCritere1.ws = new StreamWriter(monCritere1.fs);
Après tu peux même pousser le vice en stockant tes critères dans une liste générique de Critere...

Je ne sais pas si ce sont les solutions les plus optimales, mais je pense que ça peut marcher.
Je n'ai pas tester le code que j'ai écrit, mais un truc du genre doit être possible.

Cordialement,

Bidou_01 

<hr />http://blog.corioland.eu
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
Salut,

Afin de résoudre ton probleme je te poste une classe que j'ai ressorti de mon grenier :)

using

System;
using

System.IO;
using

System.Collections;
namespace

MyFrameWork.Utilz.IO{

///<summary>

/// /*Cette classe va nous permettre de faire des operations sur les fichiers

/// - creer un fichier

/// - ecrire dans un fichier

/// - lire dans un fichier

/// - renommer un fichier

/// - supprimer un fichier

///</summary>

public
class Fichier{

///<summary>

/// Constructeur par défaut

///</summary>

public Fichier(){

//

// TODO : ajoutez ici la logique du constructeur

//}

///<summary>

/// Permet de creer un fichier

///</summary>

///chemin du fichier

public
void creerFichier(
String unChemin){

//creation d'un nouveau fichier ou ecrasemet d'un fichier existant

StreamWriter monFic =
new
StreamWriter(unChemin);monFic.Close();

}

///<summary>

///cette methode permet de recupere tout le contenu d'un fichier et de le retourner

///sous forme de collection

///</summary>

///chemin du fichier a lire

///<returns>Retourne une arrayList avec chaque ligne du fichier</returns>

public
ArrayList lireFichier(
String unChemin){

ArrayList monArrayList =
new
ArrayList();

//declaration du fichier a parcourir

StreamReader unFic =
new
StreamReader(unChemin);

//declaration d'une variable intermediare qui va recuperer chaque streemReader.readline()

String ligne;

//on parcour le fichier tant qu'on a des enregistrement

while((ligne = unFic.ReadLine()) !=
null){

//et on affecte chaque ligne du fichier a la collectionmonArrayList.Add(ligne);

}

unFic.Close();

return monArrayList;}

///<summary>

/// Permet d'écrire dans un fichier

///</summary>

///Chaine a écrire dans le fichier

///Chemin du fichier à écrire

///True permet d'ecrire a la suite du fichier False Supprime le contenu du fichier pour en recrer un nouveau

///permet de définir une nouvelle ligne dans le fichier

public
void ecrireChaineFichier(
String chaine,
String unChemin,
bool aLaSuite,
bool aLaLigne){

//declaration du fichier

StreamWriter unFic;

//si on choisi d'ecrire a la suite du fichier

if(aLaSuite){

//alors on fait une nouvelle instance pour le fichier et on ajoute la valeure true n parametreunFic =

new
StreamWriter(unChemin,
true);}

else{

//sinon on fait une instance simple du fichier et celui si sera écraser si il est existantunFic =

new
StreamWriter(unChemin);}

if(aLaLigne){

//si on choisi d'ecrire a la ligne alors on utilise la methode de streamwriter

//writeLineunFic.WriteLine(chaine);

}

else{

//sinon on utilise la methode write qui va ecrire a la suite du fichier unFic.Write(chaine);

}

//et on ferme le fichierunFic.Close();

}

///<summary>

/// Permet d'ecrire plusieurs chaines dans un fichier

///</summary>

///Collection de chaine a inserer dans le fichier

///Chemin du fichier a écrire

///True permet d'ecrire a la suite du fichier False Supprime le contenu du fichier pour en recrer un nouveau

///True permet de définir une nouvelle ligne dans le fichier

public
void ecrireDesChainesFichier(
ArrayList lstChaine,
String unChemin,
bool aLaSuite,
bool aLaLigne){

//declaration du fichier

StreamWriter unFic;

//si on choisi d'ecrire a la suite du fichier

if(aLaSuite){

//alors on fait une nouvelle instance pour le fichier et on ajoute la valeure true n parametreunFic =

new
StreamWriter(unChemin,
true);}

else{

//sinon on fait une instance simple du fichier et celui si sera écraser si il est existantunFic =

new
StreamWriter(unChemin);}

if(aLaLigne){

//si on choisi d'ecrire a la ligne alors on utilise la methode de streamwriter

//writeLine en parcourant tous les element de la collection

int i;

for(i=0;i<=lstChaine.Count -1;i++){

unFic.WriteLine((

String) lstChaine[i]);}

}

else{

//sinon on utilise la methode write qui va ecrire a la suite du fichier

//en parcourant tous les elements de la collection

int i;

for(i=0;i<=lstChaine.Count -1;i++){

unFic.Write((

String) lstChaine[i]);}

}

//et on ferme le fichierunFic.Close();

}

///<summary>

/// methode qui va permettre de supprimer un fichier

///</summary>

///

public
void supprimeFichier(
String unChemin){

File.Delete(unChemin);}

///<summary>

/// cette methode permet de copier coller un fichier

///</summary>

///Chemin du fichier source

///Chemin du fichier de destination

///True un fichier existant est ecraser par le fichier coller si il à le meme nom

///<returns>retourne "ok" si la copie c'est bien passée</returns>

public
String copierColler(
String unCheminSource,
String unCheminDest,
bool ecraser){

try{

if(ecraser){

File.Copy(unCheminSource,unCheminDest,
true); }

else{

File.Copy(unCheminSource,unCheminDest,
false);}

return
"ok";}

catch(
Exception e){

return e.Message;}

}

}

}

Cela te permetra de pouvoir gérer tes logs dans les différents fichiers

Ce n'est pas un code super propre mais tu peux t'en inspirer
-------------------------------------------http://quoideneufaujourdhui.spaces.live.com