Clear Filters
Clear Filters

How to Extract Numbers after a particular String from a cell in Matlab

6 views (last 30 days)
I have read and assigned the data from Excel file to the variable raw using [num2,txt,raw] = xlsread('Excelfile1.xlsx')
The Variable raw contains 547x2 cells and I want to extract all the numbers after 'Rmin and _Ymin from all the cells in first column of the cell raw. for example 1.1 and 1.1 (see cell raw{2, 1} ).
the cell raw{2, 1} contains the string Rmin1.1_Ymin1.1_Compliance864.1285_It1000 and I just want 1.1 and 1.1 and so on from all the cells of column 1.
thanking you in anticipation
  3 Comments

Sign in to comment.

Accepted Answer

Stephen23
Stephen23 on 6 Apr 2022
Edited: Stephen23 on 6 Apr 2022
S = load('raw.mat');
raw = S.raw
raw = 547×2 cell array
{'name' } {'length_sum'} {'Rmin1.1_Ymin1.1_Compliance864.1285_It1000'} {[ 709.4780]} {'Rmin1.1_Ymin1.2_Compliance862.1186_It1000'} {[ 709.5536]} {'Rmin1.1_Ymin1.3_Compliance998.8097_It1000'} {[ 712.5063]} {'Rmin1.1_Ymin1.4_Compliance868.5314_It1000'} {[ 707.5380]} {'Rmin1.1_Ymin1.5_Compliance862.6477_It1000'} {[ 707.6292]} {'Rmin1.1_Ymin1.6_Compliance863.5961_It931' } {[ 774.9664]} {'Rmin1.1_Ymin1.7_Compliance857.0956_It1000'} {[ 776.0780]} {'Rmin1.1_Ymin1.8_Compliance862.2392_It1000'} {[ 734.3033]} {'Rmin1.1_Ymin1.9_Compliance854.211_It1000' } {[ 712.0879]} {'Rmin1.1_Ymin1_Compliance859.3505_It1000' } {[ 702.6166]} {'Rmin1.1_Ymin2.1_Compliance890.4593_It1000'} {[ 717.9015]} {'Rmin1.1_Ymin2.2_Compliance872.4193_It1000'} {[ 721.4368]} {'Rmin1.1_Ymin2.3_Compliance868.4197_It1000'} {[ 729.6224]} {'Rmin1.1_Ymin2.4_Compliance855.7838_It1000'} {[ 739.0984]} {'Rmin1.1_Ymin2.5_Compliance865.8766_It1000'} {[ 732.0453]}
Method one:
F = @(t)sscanf(t,'Rmin%f_Ymin%f',[1,2]);
C = cellfun(F,raw(2:end,1),'uni',0);
M = vertcat(C{:})
M = 546×2
1.1000 1.1000 1.1000 1.2000 1.1000 1.3000 1.1000 1.4000 1.1000 1.5000 1.1000 1.6000 1.1000 1.7000 1.1000 1.8000 1.1000 1.9000 1.1000 1.0000
Method two:
tkn = regexp(raw(2:end,1),'^Rmin(\d+\.?\d*)_Ymin(\d+\.?\d*)','tokens','once');
M = str2double(vertcat(tkn{:}))
M = 546×2
1.1000 1.1000 1.1000 1.2000 1.1000 1.3000 1.1000 1.4000 1.1000 1.5000 1.1000 1.6000 1.1000 1.7000 1.1000 1.8000 1.1000 1.9000 1.1000 1.0000
Method three:
M = sscanf(sprintf('%s@',raw{2:end,1}),'Rmin%f_Ymin%f%*[^@]@',[2,Inf]).'
M = 546×2
1.1000 1.1000 1.1000 1.2000 1.1000 1.3000 1.1000 1.4000 1.1000 1.5000 1.1000 1.6000 1.1000 1.7000 1.1000 1.8000 1.1000 1.9000 1.1000 1.0000
  4 Comments
Stephen23
Stephen23 on 25 May 2022
Edited: Stephen23 on 25 May 2022
tbl = readtable('sum_length_20.xlsx')
tbl = 546×2 table
name length_sum ________________________________________________ __________ {'100_Rmin1.4_Ymin2.5_Compliance400.1796_It449'} 1443.2 {'101_Rmin1.4_Ymin2.6_Compliance413.2265_It510'} 1467.7 {'102_Rmin1.4_Ymin2.7_Compliance411.9452_It341'} 1468.9 {'103_Rmin1.4_Ymin2.8_Compliance415.3184_It480'} 1464.1 {'104_Rmin1.4_Ymin2.9_Compliance415.2841_It702'} 1452.2 {'105_Rmin1.4_Ymin3_Compliance414.67_It1000' } 1460.4 {'106_Rmin1.5_Ymin1_Compliance398.7844_It333' } 1448.5 {'107_Rmin1.5_Ymin1.1_Compliance403.9337_It189'} 1469.9 {'108_Rmin1.5_Ymin1.2_Compliance398.8366_It311'} 1447.8 {'109_Rmin1.5_Ymin1.3_Compliance398.9644_It336'} 1446.8 {'10_Rmin1_Ymin1.9_Compliance400.2463_It172' } 1494.8 {'110_Rmin1.5_Ymin1.4_Compliance420.9736_It595'} 1497.1 {'111_Rmin1.5_Ymin1.5_Compliance400.0201_It246'} 1456.6 {'112_Rmin1.5_Ymin1.6_Compliance397.5542_It311'} 1463.1 {'113_Rmin1.5_Ymin1.7_Compliance402.336_It270' } 1449.3 {'114_Rmin1.5_Ymin1.8_Compliance401.9567_It303'} 1454.3
Method one:
F = @(t)sscanf(t,'%f_Rmin%f_Ymin%f',[1,Inf]);
C = cellfun(F,tbl.name,'uni',0);
M = vertcat(C{:})
M = 546×3
100.0000 1.4000 2.5000 101.0000 1.4000 2.6000 102.0000 1.4000 2.7000 103.0000 1.4000 2.8000 104.0000 1.4000 2.9000 105.0000 1.4000 3.0000 106.0000 1.5000 1.0000 107.0000 1.5000 1.1000 108.0000 1.5000 1.2000 109.0000 1.5000 1.3000
Method two:
tkn = regexp(tbl.name,'^(\d+)\D+(\d+\.?\d*)\D+(\d+\.?\d*)','tokens','once');
M = str2double(vertcat(tkn{:}))
M = 546×3
100.0000 1.4000 2.5000 101.0000 1.4000 2.6000 102.0000 1.4000 2.7000 103.0000 1.4000 2.8000 104.0000 1.4000 2.9000 105.0000 1.4000 3.0000 106.0000 1.5000 1.0000 107.0000 1.5000 1.1000 108.0000 1.5000 1.2000 109.0000 1.5000 1.3000
Method three:
M = sscanf(sprintf('%s@',tbl.name{:}),'%f_Rmin%f_Ymin%f%*[^@]@',[3,Inf]).'
M = 546×3
100.0000 1.4000 2.5000 101.0000 1.4000 2.6000 102.0000 1.4000 2.7000 103.0000 1.4000 2.8000 104.0000 1.4000 2.9000 105.0000 1.4000 3.0000 106.0000 1.5000 1.0000 107.0000 1.5000 1.1000 108.0000 1.5000 1.2000 109.0000 1.5000 1.3000

Sign in to comment.

More Answers (0)

Categories

Find more on Data Type Conversion in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!