Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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);
end

while 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);
end

mclose(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