#1 Le 31/03/2008, à 21:28
- arnaud_d
[Scilab] Lecture de données séparées par des tabulations
Bonjour,
Je dispose d'un fichier texte avec des donnée dedans et je souhaite les lire avec Scilab. Après plusieurs lignes d'en-tête, mes mesures apparaissent comme suit :
" 25 " 56,6 "x"
" 31,5 " 50,8 "x"
" 40 " 50,6 "x"
" 50 " 52,7 "DR"
" 63 " 63,1 "D"
" 80 " 67,8 "D"
"100 " 71,4 "D"
"L-Total" 81,7 "DR"
La série {25 31,5 40 ...} correspond à mes valeurs X et la série {56,6 50,8 50,6 ...} correspond à mes valeurs Y.
Mon but est de récupérer les valeurs Y dans un tableau de réels.
Pour l'instant voici comment je procède :
1) je lis les lignes une par une jusqu'à ce que le troisième caractère de la ligne soit un 2 (ce qui n'arrive jamais sauf pour " 25 " à la première ligne. Cela me permet de passer l'en-tête.
f=tk_getfile();
fid=mopen(f);
data=[];
myStop=[];
while myStop <> '2'
tline=mgetl(fid,1);
myStop=part(tline,3);
end
2) Je prend chaque ligne suivante et je la décompose via la fonction msscanf en 4 strings.
while myStop <> 'L'
linedata=msscanf(tline,'%s %s %s %s');
value=linedata(4);
tline=mgetl(fid,1);
myStop=part(tline,2);
end
Cette méthode marche très bien jusqu'à la ligne
" 80 " 67,8 "D"
où par exemple je récupère quatres chaines : {"},{80},{"} et {67,8}.
Pour l'instant tout va bien, je récupère la quatrième chaine, convertis la virgule en point et transforme la chaine en réel comme suit :
value=linedata(4);
a=str2code(value);
for i=1:length(a)
if a(i)==52
a(i)=51;
end,
end;
value=evstr(code2str(a));
(pour info 52 c'est le code correspondant à une virgule et 51 à un point).
Problème : quand j'arrive à la ligne suivante,
"100 " 71,4 "D"
le découpage se fait comme suit : {"100},{"},{71,4} et {"D"} car le 100 est collé à la première {"}.
Du coup la donnée qui m'intéresse n'est plus la quatrième chaine mais la troisième.
J'ai simplifié le fichier de données mais après ça recommence, la valeur X n'est de nouveau pas collé à la première parenthèse.
Ce qu'il faut savoir c'est que les champs trois champs (" 25 " 56,6 "x") sont séparés par une tabulation.
J'ai pris du temps à expliquer le contexte, j'en viens donc à ma question principale :
Est-il possible de découper une string en spécifiant que le séparateur est une tabulation ?
En fait si je pouvais tout simplement écrire quelque chose comme :
linedata=msscanf(tline,'%s \t %s \t %s \t %s');
ou
linedata=msscanf(tline,'%s %s %s %s','\t');
ça serait le rêve.
Alors voilà je jette cette bouteille à la mer : peut-être qu'il existe une façon très propre et très simple de faire les choses. Pourtant j'ai cherché longtemps dans l'aide et sur internet, je n'ai rien trouvé.
Attention, je cherche à découper les lignes une par une, je n'ai pas tout un fichier de données séparées par des tabulations.
Je pense à une technique bourin où je vais convertir chaque ligne en un tableau de codes ASCII, rechercher les tabulations et extraire la donnée qui m'interesse. C'est vraiment moche, mais si il n'existe pas mieux, je reveiendrais poster ma solution bidouillée.
Merci à tout ceux qui auront eu le courage de lire mon post en entier.
Arnaud
Hors ligne
#2 Le 31/03/2008, à 22:16
- arnaud_d
Re : [Scilab] Lecture de données séparées par des tabulations
Bon bha voilà la solution "bourin", ça marche...
f=tk_getfile();
fid=mopen(f);
data=[];
myStop=[];while myStop <> '2'
tline=mgetl(fid,1);
myStop=part(tline,3);
endwhile myStop <> 'A'
pos=strindex(tline,code2str(-40));
value=part(tline,pos(1)+1:pos(1)+4);
a=str2code(value);
for i=1:length(a)
if a(i)==52;
a(i)=51;
end,
end;
value=evstr(code2str(a));
data= [data; value;];
tline=mgetl(fid,1);
myStop=part(tline,2);
endmclose(f);
J'attends un peu avant de mettre un "Résolu" au cas où...
Dernière modification par arnaud_d (Le 31/03/2008, à 22:18)
Hors ligne