1
votes

Séparation des noms de fichiers MATLAB

Dans le nom de fichier " nom " comme '10_m1_m2_const_m1_waves_20_90_m2_waves_90_20_20200312_213048' je dois séparer '10_m1_m2_const_m1_waves_20_90_m2_waves_90_20' from '20200312_213048'

movefile([confpath,name(without 20200312_213048),'.config'],[name(without 20200312_213048), filesep, name, '.config']);

ne fonctionne pas, car un nombre de "_" est variable.

J'ai donc besoin de déplacer un fichier:

name_sep = split(name,"_");
sep = '_';
name_join=[name_sep{1,1} sep name_sep{2,1} sep .....];

Avez-vous une idée? Merci!


4 commentaires

Comment identifier le bon endroit pour couper? Est-ce toujours le 12e _ ? La queue est-elle toujours du modèle _ ? Je suis sûr que les expressions régulières fonctionneront, mais nous devons d'abord comprendre le modèle.


Que diriez-vous de trouver l'avant-dernier trait de soulignement? Cela fonctionnerait-il? Comment définissez-vous l'endroit où couper?


@Daniel non, c'est le problème. Parfois, il appelle comme '1_m1_waves_20_90_20200311_203018' donc sa variable


@Chris Luengo mais comment? la pièce "20200312_213048" a toujours le même format: AAAAMMJJHHMMSS Comment définissez-vous l'endroit où couper? - c'est un deuxième soulignement "_" avant la fin


3 Réponses :


1
votes

Vous pouvez utiliser strfind . Soit si vous avez une clé qui est toujours présente avant ou après le point où vous souhaitez diviser le nom:

idx = strfind(nm,'_');
nm(idx(end-2)+1:end)

Ou si vous savez comment _ la partie que vous voulez avoir:

nm = '10_m1_m2_const_m1_waves_20_90_m2_waves_90_20_20200312_213048';

key = 'waves_90_20_';
idx = strfind(nm,key) + length(key);
nm(idx:end)

Dans les deux cas, le résultat est:

"20_20200312_213048"


1 commentaires

Merci! Je peux utiliser une deuxième partie =)



2
votes
  • Vous pouvez peut-être essayer regexp pour trouver la position de départ de la séparation:
  • name_sep =
    {
      [1,1] = 10_m1_m2_const_m1_waves_20_90_m2_waves_90_20
      [1,2] = 20200312_213048
    }
    

    tel que

    name_sep = cell2mat(regexp(name,'(.*)_(\d+_\d+$)','tokens','match'));
    
    • Ou le code ci-dessous avec l'option tokens :
    name1 = 10_m1_m2_const_m1_waves_20_90_m2_waves_90_20
    name2 = 20200312_213048
    

    ce qui donne

    ind = regexp(name,'_\d+_\d+$');
    name1 = name(1:ind-1);
    name2 = name(ind+1:end);
    

1 commentaires

@Fracture De rien! Si vous pensez que ma réponse est utile, n'hésitez pas à voter pour / accepter, merci!



1
votes

Tant que l'horodatage est toujours à la fin de la chaîne, vous pouvez utiliser strfind et compter à rebours à partir de la fin de la chaîne:

name = '10_m1_m2_const_m1_waves_20_90_m2_waves_90_20_20200312_213048';
udscr = strfind(name,'_');
name_date = name(udscr(end-1)+1:end)
name_meta = name(1:udscr(end-1)-1)

name_date =

    '20200312_213048'

name_meta =

    '10_m1_m2_const_m1_waves_20_90_m2_waves_90_20'


0 commentaires