Lecture fichier texte entre deux "index"

metalimad Messages postés 9 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 19 janvier 2006 - 2 janv. 2006 à 15:45
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 2 janv. 2006 à 22:44
Bonjour,

J'aimerai lire depuis un fichier texte, un ensemble de caractères (dont le retour chariot) entre deux index donnés.

l'idée est la suivante :

" Il est 10h20
xx log xx
blabla
blabla
xx log xx"

j'aimerai pouvoir lire entre les deux (xx log xx), ce qu'il y a à l'intérieur. càd récupérer les deux "blabla" ..

Notez que mes fichiers textes peuvent atteindre plusieurs centaines de Mo, donc une idée de parcours classique sera très gourmande en mémoire et temps d'exec.

Merci de votre aide!

7 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2006 à 15:51
Salut,
Je pense qu'une expression régulière compilée pour faire l'affaire, non ?


<HR>

[Pub] http://www
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2006 à 16:26
Jette un oeil sur le namespace System.Text.RegularExpression.
Tu y trouveras des classes pour travailler avec les expressions régulière, notemment la class Regex.


<HR>

[Pub] http://www
0
metalimad Messages postés 9 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 19 janvier 2006
2 janv. 2006 à 16:41
j'avais compris ;)

mais je crois pas que c'est la solution pour mon problème, en fait je crois que je me suis mal exprimé, je m'en excuse.

je vais écrire un bout de code, cela pourrait vous parler plus :

FileStream fs = new FileStream(filename, fileaccess.read ...);
StreamReader sr = new StreamReader(fs);

do
{
s = sr.ReadLine();
if( s.StartsWith("xx log xx")
{
//récupérer l'index de début.
// ce qui est étonnant ici est que si j'utilise sr.position, ça me renvoie la fin de fichier! et avec fs.Seek(0, SeekOrigin.Current), je n'arrive pas à avoir
// un long qui me montre où je suis actuellement.

}

}while(s!=null)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2006 à 21:54
A vrai dire je ne suis pas tout à fait sur de ce que j'avance, mais il me semble que la Position fonctionne seulement si tu fais un Read() et pas un ReadLine(), c'est pour ça qu'il retourne la fin du fichier...
Mais je n'en suis pas tout à faire sur, vérifie dans la doc !


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2006 à 22:03
Une idée pour faire ce que tu veux (rapidement fait) :


ArrayList al =
new ArrayList();
FileStream fs =
new FileStream("test.txt", FileMode.Open);
StreamReader sr =
new StreamReader(fs);

bool read =
false;

string curLine =
null;



while((curLine = sr.ReadLine()) !=
null)
{
if(curLine "xx log xx") read !read;

if(read) al.Add(curLine);
}


al.RemoveAt(0);
sr.Close();
fs.Close();


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 2
2 janv. 2006 à 22:20
Je viens de trouver une source sur le site: http://www.csharpfr.com/code.aspx?ID=34866


<OL>
<LI>/// <summary>
<LI>/// Remplace une chaine comprise entre 2 bornes
<LI>/// </summary>
<LI>/// Chaine d'origine


<LI>/// Borne de début


<LI>/// Borne de fin


<LI>/// Chaine de remplacement


<LI>/// Si true la chaine résultant conserva les bornes


<LI>/// <returns>Chaine résultat</returns>
<LI>
public
string
RemplaceChaineEntre(
string
orig,
string
debut,
string
fin,
string
remplacement,
bool
laisseBornes) {
<LI> <SAMP>// on construit l'expression régulière en fonction</SAMP>
<LI> <SAMP>// des paramètres passés</SAMP>
<LI>
string
pattern =
string
.Format(<VAR>"({0})(.*?)({1})"</VAR>, debut, fin);
<LI>
<LI> <SAMP>// on instancie un objet Regex </SAMP>
<LI> Regex regex =
new
Regex(pattern, RegexOptions.Singleline);
<LI>
<LI> <SAMP>// on retourne une chaine dans laquelle on a remplacé</SAMP>
<LI> <SAMP>// la portion désirée</SAMP>
<LI>
if
(laisseBornes)
<LI> {
<LI>
return
regex.Replace(orig, <VAR>"$1"</VAR> + remplacement + <VAR>"$3"</VAR>);
<LI> }
<LI>
else

<LI> {
<LI>
return
regex.Replace(orig, remplacement);
<LI> }
<LI>} </LI></OL>
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 janv. 2006 à 22:44
Tiens donc, finalement tu reprends la première idée que je t'ai donnée ?


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Rejoignez-nous