Extracting the numbers from file names and listing them in a column

3 vues (au cours des 30 derniers jours)
Babu Sankhi
Babu Sankhi le 21 Jan 2021
Commenté : Babu Sankhi le 22 Jan 2021
Hi all ,
I have png files like this ;
Rpma26siatBz 9.500000 Bx 0.000000mT WWait 2.000000Sec.Bzat9.5mT83.png,
Rpma26siatBz 9.500000 Bx 100.000000mT WWait 1.000000Sec.Bzat9.5mT85.png
and so on
I want to extract numbers 0.000000 from first file ,100.000000 from second file etc .and put in one column.
And again extract the numbers 2.000000 from first file,1.000000 from second file etc. and put in another column.
I tried writing the code like this but it didnt work ( I mean I got NAN)? It would be great if you share any ideas for doing it .
thank you
clear all;
close all;
clc;
listI=dir('*.png');
B=[];
for i=1:length(listI);
n=listI(i);
A1 =n(1:end-26);
A2 = n(1:end-19);
x1= str2double(A1);
x2=str2double(A2);
Bx=[B;(x1),(x2)];
end

Réponse acceptée

Stephen23
Stephen23 le 21 Jan 2021
Modifié(e) : Stephen23 le 21 Jan 2021
C = {'Rpma26siatBz 9.500000 Bx 0.000000mT WWait 2.000000Sec.Bzat9.5mT83.png',...
'Rpma26siatBz 9.500000 Bx 100.000000mT WWait 1.000000Sec.Bzat9.5mT85.png'};
M = sscanf([C{:}],'Rpma%*dsiatBz%*f Bx%fmT WWait%fSec.Bzat%*fmT%*d.png',[2,Inf]).'
M = 2×2
0 2 100 1
Or
W = regexp(C,'(?<=\s)\d+\.\d+(?=[A-Za-z])','match');
M = str2double(vertcat(W{:}))
M = 2×2
0 2 100 1
  5 commentaires
Stephen23
Stephen23 le 22 Jan 2021
"..it does not work for these png files"
The first name has extra character/s which do not match the format string:
%...SecBzat.... 1st name
% ^ not in format string!
%...SeBzat.... 2nd and 3rd names
%...SeBzat.... format string
sscanf will stop parsing the string as soon as it reaches that 'c' character, because it does not match the format string and so does not know how to handle it. You can perform more flexible matching like this:
C = {'Rpma26siatz -9.600000 Bx -100.000000mT Waait 600.000000SecBzat-9.6mTDAQ02.png',...
'Rpma26siatz -9.600000 Bx 40.000000mT Waait 2000.000000SeBzat-9.6mTDAQ45.png',...
'Rpma26siatz -9.600000 Bx 130.000000mT Waait 1500.000000SeBzat-9.6mTDAQ27.png'};
M = sscanf([C{:}],'%*[ A-Za-z.]%f',[6,Inf]).'
M = 3×6
26 -9.6 -100 600 -9.6 2 26 -9.6 40 2000 -9.6 45 26 -9.6 130 1500 -9.6 27
Babu Sankhi
Babu Sankhi le 22 Jan 2021
thanks for your great help

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by