Ca va pas lui poser de problème qu'on lui dise de chercher 20100101 alors qu'on a des lignes qui commencent par 20100101**** ?
Ca va pas lui poser de problème qu'on lui dise de chercher 20100101 alors qu'on a des lignes qui commencent par 20100101**** ?
Idx = find(cellfun(@(x) ~isempty(strfind(x,'201001010000')),T));C'est un genre de définition de fonction qui va évaluer le contenu de chaque cellule de la variable T.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (@(x) ~isempty(strfind(x,'201001010000'))
Cela équivaudrai à:
Tu as aussi la possibilité d'utiliser une fonction de Matlab ou une que tu as créée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 function out = f(x) out = ~isempty(strfind(x,'201001010000'))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cellfun(@mean,T); cellfun(@mafonction,T);
Non aucun problèmeCa va pas lui poser de problème qu'on lui dise de chercher 20100101 alors qu'on a des lignes qui commencent par 20100101**** ?
Tu peux essayer rapidement sur
Dans les deux cas, strfind retourne 1, autrement dit le premier indice du critère cherché dans T
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 T = '201001010000'; strfind(T,'20100101') T = '201001015678'; strfind(T,'20100101')
J'aurais appris un sacré paquet de trucs grâce à vous !
Donc si j'ai bien compris cette ligne de commande renvoie tous les numéros de lignes où on trouve '*20100101*' ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part Idx = find(cellfun(@(x) ~isempty(strfind(x,'critere')),T));
Et les deux lignes suivantes me permettront d'avoir une structure avec toutes les lignes incluant mon critère?
Et après on fait un textscan sur toutes les lignes comprises entre une des lignes où on a trouvé '20100101' et la ligne suivante où on retrouve notre critère??
Je changerai juste un peu le code de cette façon :
car j'ai besoin de stocker également les lignes avec les dates pour mon étude.. Du coup il me faudra aussi ajouter un troisième textscan non??
Code : Sélectionner tout - Visualiser dans une fenêtre à part T1=T(Idx(j):Idx(j-1));
Attention critere sans guillemets, sinon strfind va chercher 'critère' au lieu de '20100101'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 for i= 1:nb_j f = input('Quelles sont les dates? (format YYYYMMDD) ','s'); fname{i} = ['C:\Users\Guillaume\Documents\matlab stage\HDIAGGLOB22+' f '+W02.txt']; T = textread(fname{i},'%s','delimiter','\n'); W02_file{i}.header = {T{1:2}}'; % Stockage des 2 premières lignes Date = char(T{3}); % 3ème ligne contenant la date Critere= Date(1:8); % Extraction du criète Idx = find(cellfun(@(x) ~isempty(strfind(x,Critere)),T)); % Trouver toutes les ligne contenant le critère W02_file{i}.dates = T(Idx); % Stockage des ligne des dates contenant contenant les critères Idx = [Idx ;length(T)]; % Ajouter la longueur de T pour pouvoir bien utiliser la boucle for d'après for j = 1:length(Idx)-1 T1 = T(Idx(j)+1:Idx(j+1)-1); % Données de la date j W02_file{i}.datas(j,1:6) = [textscan(char(T1(1:2:end))','%d %d') textscan(char(T1(2:2:end))','[ %2c] %f %f %f')]; % Stockage des données end endNon je le fait déjà, en fait c'est la ligneEt les deux lignes suivantes me permettront d'avoir une structure avec toutes les lignes incluant mon critère?
Et après on fait un textscan sur toutes les lignes comprises entre une des lignes où on a trouvé '20100101' et la ligne suivante où on retrouve notre critère??
Je changerai juste un peu le code de cette façon :
car j'ai besoin de stocker également les lignes avec les dates pour mon étude.. Du coup il me faudra aussi ajouter un troisième textscan non??
Code : Sélectionner tout - Visualiser dans une fenêtre à part T1=T(Idx(j):Idx(j-1));
Code : Sélectionner tout - Visualiser dans une fenêtre à part W02_file{i}.dates = T(Idx);
Oui j'ai vu que tu avais crées une nouvelle matrice .dates mais j'aurais voulu avoir également la ligne corresopndant à la date dans mon fichier .data ..
Oui j'ai vu ca ('critere') en le testant à l'instant
Juste une dernière petite question :
Ca correspond à quoi le 1:6 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part W02_file{i}.datas(j,1:6)
Correspond aux 6 colonnes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part W02_file{i}.datas(j,1:6)
14677. 1 [ O3] 0.87862E-07 0.25611E-06 0.16825E-06
[EDIT] J'ai changé mon post précédent en commentant le code
OK merci c'est bien ce qu'il me semblait..
Par contre j'ai un problème sur les lignes impaires. Là où par exemple on a:
Je retrouve dans le tableau:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 14677. 1 [ O3] 0.87862E-07 0.25611E-06 0.16825E-06 10000. 1 [ O3] 0.16696E-06 0.84277E-06 0.67581E-06 6812. 1 [ O3] 0.71407E-06 0.18679E-05 0.11538E-05 4641. 1 [ O3] 0.21635E-05 0.40769E-05 0.19134E-05 3162. 1 [ O3] 0.40701E-05 0.63845E-05 0.23144E-05 2154. 1 [ O3] 0.69746E-05 0.52141E-05 -0.17605E-05 1467. 1 [ O3] 0.90825E-05 0.98523E-05 0.76981E-06
[14677;16812;4641;3162;2154;1467] [110000;1;1;1;1;1] [7x2 char] ...
Le 1 de la première ligne se retrouve devant le 10000 et considère donc que "110000" est le deuxième caractère de la première ligne. Par contre il réagit bien sur les lignes suivantes.
Problème de format? J'en ai essayé plusieurs ca n'améliore pas grand chose. Mais c'est bizarre comme problème vu que le formalisme est toujours identique et qu'il se trompe qu'au début non?
Oui en effet, c'est du au fait que la longueur du premier chiffre varie.
Après moultes essais, je suis arrivé à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for j = 1:length(Idx)-1 T1 = T(Idx(j)+1:Idx(j+1)-1); % Données de la date j D = cellfun(@(x) str2double(regexp(x,'. ','split')),T1(1:2:end),'UniformOutput',false); % Mise en forme des lignes à 2 chiffres W02_file{i}.datas(j,1) = {cell2mat(D)}; % Stockage des lignes à 2 chiffres de la date j W02_file{i}.datas(j,2:5) = textscan(char(T1(2:2:end))','[ %2c] %f %f %f'); % Stockage des lignes à 4 chiffres de la date j end
Merci pour tout! Ton petit code est parfait
A bientôt!
Argh ce code va me faire devenir fou!
Grâce à Winjerome mon code tourne parfaitement sur mon ordinateur perso (Version R2008b).
Probème, sur le pc du bureau je n'ai accès "qu'à" la version 2005 qui ne connait pas encore l'option "split" de la fonction regexp..
Y-a-t-il une librairie qui me permettrait de l'installer? Ou un autre moyen pour mettre en forme la ligne en question qui pose problème??
Je n'ai pas suivi toute la discussion mais la fonction split n'est pas dur à encoder.
Regexp va te donner les indices des caractères que tu cherches et il ne restera plus qu'à faire un boucle sur ces positions pour isoler tes éléments.
Petit exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 A=['jjj//jjj/jjj/jjj/']; pos=regexp(A,'/'); pos=[0 pos length(A)+1]; for i =1:length(pos)-1 G{i}=A(pos(i)+1:pos(i+1)-1); end
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager