Bonjour,
Dans le cadre d'un projet, je dois extraire les données d'un fichier .dat contenant les coefficients de chaleur massique de différentes espèces chimiques.
Le fichier fait 80*74 caractères et se présente comme ceci : (extrait)
CO RUS 79C 1O 1 0 0G 200.000 6000.000 1000. 1
0.30484859E+01 0.13517281E-02-0.48579405E-06 0.78853644E-10-0.46980746E-14 2
-0.14266117E+05 0.60170977E+01 0.35795335E+01-0.61035369E-03 0.10168143E-05 3
0.90700586E-09-0.90442449E-12-0.14344086E+05 0.35084093E+01-0.13293628E+05 4
(La présentation n'est pas terrible, voir PJ)
Le but est de récupérer :
1ère ligne : le nom de l'espèce (ds l'exemple CO), la température basse (200.000), la température haute (6000.000) et la température moyenne (1000.)
Lignes 2, 3 et 4 : les valeurs numériques des 5 coefficients mis bout à bout
Et de réitérer le processus pour les 18 espèces que compte le fichier.
J'ai déjà "pondu" une ébauche de code qui me permet de mettre chaque caractère dans une case d'une matrice 72*80 :
1 2 3 4 5 6 7 8 9 10 11
|
fid=fopen('base_small.dat','r');
c=fscanf(fid,'%c'); %seul le type character fonctionne
n=0;
for i=1:74
for j=1:80
M(i,j)=c(j+n*80);
end
n=n+1;
end
fclose(fid); |
Le souci ici est que je n'ai absolument aucune idée de comment dire à MATLAB de fusionner les cellules entre-elles pour former un nombre double précision, une chaîne de caractère pour le nom d'espèce et réintégrer tout ça dans une matrice qui me permette d'accéder aux coefficients qui m'intéressent.
J'ai essayé d'utiliser une autre fonction à la place de fscanf : textscan.
Elle devrait pouvoir résoudre mon problème de conversion de format.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
fid=fopen('base_small.dat','r');
n0=0;
for i=1:74
for j=1:80
if(i==1+n0*4)
Q(i,j)=textscan(fid,'%15c %30c %7.3f %7.3f %6.2f %7c');
n0=n0+1;
else
Q(i,j)=textscan(fid,'%2.8f %2.8f %2.8f %2.8f %2.8f %5c');
end
end
end
fclose(fid); |
Mon but est de créer une matrice 74*6 avec :
## sur les lignes 1, 5, 9, etc. les noms des espèces d'une longueur de 15 caractères, puis 30 caractères inutiles pr la suite, la température haute avec 6 chiffres avant la virgule et 3 derrière, idem pour température basse et moyenne, et enfin 7 autres caractères inutiles
## sur les autres lignes (celles où il y a les coefficients) 5 nombres doubles précisions (je ne sais pas trop comment lui faire lire la notation ingénieur) et 5 caractères inutiles.
Lorsque je lance mon code, voici l'erreur :
Subscripted assignment dimension mismatch.
Error in ==> tabCoeff2 at 10
Q(i,j)=textscan(fid,'%15c %30c %7.3f
%7.3f %6.2f %7c');
Merci d'avance pour toutes vos suggestions.
Partager