Manipulation d'un fichier formatté spécial

cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008 - 24 oct. 2004 à 12:01
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008 - 13 janv. 2005 à 18:48
Bonjour,

Je suis entrain d'essayer de faire un petit programme qui me sera utile dans mon travail.
J'ai un fichier qui se nomme "fichier.raw" avec des données écrites en texte sur lequel je voudrais récupérer quelques valeurs.
En fait, ça fait un petit bout de temps que j'essaye, mais j'ai beaucoup de mal à faire un programme pour pouvoir manipuler les données que je veux.
Ce que je voulais faire, c'est faire appel à votre grand sens de programmateurs avertis et surtout habitués, voir professionnels pour m'aider un peu...

Je vais donc vous mettre un fichier type que j'obtiens, et vous dire les données que je souhaite récupérer!
Le fichier type contient:

//début du fichier à la ligne suivante:
>Controller # 86: galvanostatic channel # 8
>Username:
>Acquisition started on: Dim 7 fŽv 1904 16:36
>Saved on file: jb106a_8.RAW
>Cell description: jb106 Cu0,3 pur C/20 0,1-2 red
>Mass of active material: 5.100 mg weighted at x = 0.000
>Molecular weight of active material(at x = 0): 51.811 g
>Atomic weight of intercalated ion: 6.941 g
>Acquisition started at xo = 0.000
>Number of e- transferred per intercalated ion: 1>(For Æx 1, ÆQ 2.638 mAh)
>Æx max allowed on a sweep: 3.000 (ÆQmax=7.915 mAh)
>No amplifier (Imax>=10.0 mA)
>No Uaux recording
>Test Uwrk
>
> Relaxation (same as below)
>
> Do 200 sweep(s)
>
> While Ueq>0.120V (red) or Ueq<1.980V (ox)
> or |ÆQ|<ÆQmax
>
>Set I at -0.1325mA,60.000h (odd) or 0.1325mA,60.000h (even)
> Curtail if U<0.100V (red) or U>2.000V (ox)
> or if |Ueq-U|>1.900V or if |ÆQ|>ÆQmax
> Record 1 init. pt. +1 pt./0.005V +1 final pt.
>
> Relaxation: open circuit for 0.000h
> or until|ÆU/Æt|<|ÆUo/Æto|/60000 or |ÆU/Æt|<0.00 mV/h
> Record 1 init. pt. +1 pt./0.010V +1 final pt.
>
> Next sweep
>
>
>
>
>
>
>
Time/h Uwrk/V I/mA Error xo,x'(Q)
0.000 1.111 -0.000 0 0.000000
0.000 1.091 -0.1325 0 -3.790404e-1
0.003 1.061 -0.1325 0
0.006 1.051 -0.1325 0
0.008 1.044 -0.1325 0
0.011 1.038 -0.1325 0
1.664 0.141 0.1325 0
1.667 0.221 0.1325 0
1.669 0.261 0.1325 0
5.311 1.356 -0.1325 0
5.314 1.331 -0.1325 0
5.317 1.307 -0.1325 0
5.319 1.287 -0.1325 0
5.322 1.267 -0.1325 0
//fin du fichier

En fait, je voudrais récupérer les valeurs suivantes:
>Mass of active material: 5.100 mg weighted at x = 0.000
dans cette ligne, il me faut 5.100 et 0.000
>Molecular weight of active material(at x = 0): 51.811 g
dans cette ligne, il me faut 51.811
>Atomic weight of intercalated ion: 6.941 g
dans cette ligne, il me faut 6.941
>Acquisition started at xo = 0.000
dans cette ligne, il me faut 0.000
>Number of e- transferred per intercalated ion: 1
dans cette ligne, il me faut 1
puis:
Time/h Uwrk/V I/mA Error xo,x'(Q)
0.000 1.111 -0.000 0 0.000000
0.000 1.091 -0.1325 0 -3.790404e-1
0.003 1.061 -0.1325 0
0.006 1.051 -0.1325 0
0.008 1.044 -0.1325 0
0.011 1.038 -0.1325 0
1.664 0.141 0.1325 0
1.667 0.221 0.1325 0
1.669 0.261 0.1325 0
5.311 1.356 -0.1325 0
5.314 1.331 -0.1325 0
5.317 1.307 -0.1325 0
5.319 1.287 -0.1325 0
5.322 1.267 -0.1325 0

ici, il me faut ranger les données dans des colonnes, la première ligne étant les titres des colonnes (time/h, Uwrk/V, etc...)
et les lignes suivantes étant les données contenues dans chaques colonnes (valeurs séparées par des espaces), la colonne "x0,x'(Q)" n'étant donnée qu'en première et deuxième ligne...

Je voudrais faire appel à une âme charitable, qui voudrait bien m'aider à récupérer ces valeurs et les manipuler dans un projet Win32, soit simplement en m'aidant, soit en me donnant une méthode, soit en faisant une bonne partie du boulot (lol) pour que je puisse comprendre comment faire un truc dans le genre, soit à vous de voir.

En espérant que vous allez réussir à m'enlever cette épine du pied, j'attends vos réponses avec impatence.
Merci.

JB

2 réponses

otofraise Messages postés 66 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 4 novembre 2010
12 janv. 2005 à 21:26
Bonjour,

Je viens de prendre connaissance de votre message.
Je ne sais pas si ma reponse vous sera encore utile, essayons tout de meme

Je vous conseillerai de realiser une fonction qui vous retournerai le texte trouve entre deux chaines de caracteres specifiees. Ce qui donnerai :

string ExtracChaine(FILE* Fichier, string ChaineAvant, string ChaineApres);

ensuite le principe est simple, vous lisez votre fichier caractere par caractere en les enregistrant dans une variable string. Sitot que votre string contient le meme nombre de caractere que ChaineAvant vous testez l'égalite entre la string obtenue et ChaineAvant.

Si ca correspond, vous n'avez plus qu'a enregistrer les caractere suivant jusqu'a trouve ChaineApres.

Dans le cas contraire, vous devez retirer le 1° caractere de la string obtenue et y ajouter le prochain caractere lu et refaire le test. Tout ca jusqu'a ce que vous trouviez la ChaineAvant ou la fin du fichier.

string ExtracChaine(FILE* Fichier, string ChaineAvant, string ChaineApres)
{
char CaracLu;
string ChaineTemp;
string ValRet = "";
bool Arret = false;

if(Fichier)
{
while(!Arret)
{
if(!fread(&CaracLu, sizeof(CaracLu), 1, Fichier))
{
Arret = true;
}
else
{
ChaineTemp += CaracLu;
if(Trouve && ChaineTemp.find(ChaineApres))
{
ValRet = ChaineTemp.substring(0, ChaineTemp.length() - ChaineTemp.find(ChaineApres));
Arret = true;
}
else if(ChaineTemp.length() == ChaineAvant.length())
{
if(ChaineTemp == ChaineAvant)
{
Trouve = true;
ChaineTemp = "";
}
else
{
ChaineTemp = ChaineTemp.substring(0, ChaineTemp.length() - 1);
}
}
}
}
}

return ValRet;
}

Je n'ai pas teste ce code, mais le principe doit etre bon.
Je n'ai pas non plus l'habitude d'utiliser les string (string.h) mais les fonctions doivent etre assez proches. Si vous travaillez avec les AnsiString de Borland ou un autre format de chaine de caractere "evoluee", vous adapterez facilement ce code.

En cas de probleme, n'hesitez pas

Oto
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
13 janv. 2005 à 18:48
Tout d'abord, je tenais à vous remercier d'avoir répondu à ma question.
Le principe de votre fonction est pas mal, mais en fait, je ne m'en servirai pas, car, comme vous l'avez dit, je n'en ai plus besoin en ce moment....
En fait, j'ai réussi à faire quelque chose de pas mal, avec l'aide de djl il y a quelques temps maintenant!
Mais j'ai quand même lu votre méthode qui est relativement simple, et qui, je pense doit fonctionner parfaitement, même pour un prochain problème similaire, ça peut toujours servir... Er si ça ne sert pas à moi, peut être que ça pourra servir à quelqu'un d'autre!

Encore merci, et bonne continuation dans vos programmations.

JB
0
Rejoignez-nous