loop over struct with multiple functions
1 次查看(过去 30 天)
显示 更早的评论
Dear MATLAB Community,
I have the following problem:
I need to extract 2 specific numbers from pretty large txt files from a specific line. The line(s) is (are) not the same for each txt file. Also in some txt files there is only one line of interest.
I have written the following code to extract the numbers I am interested in from one (manually) entered txt file. In total I have (in the case of a txt file with 2 lines of interest) 4 variables (cal1avg, cal1max, cal2avg, cal2max) which correspond to the 2 numbers per line (4 because there are 2 lines with 2 numbers each). In case of only one line of interst I have set up an if clause that sets the values of the other 2 numbers from the missing line to 0 .
this works, so far so good.
now I want to loop this procedure over many txt files. I imported the txt files into a struct. I want to loop the procedure mentioned over all files from the struct. I further want to add new "collumns" to the struct, one collomn for each variable (cal1avg, cal1max,...).
I tried it without the if function to see if that even works - it does not.
my endproduct should be similar to the following
collumns: filename | cal1avg | cal1max | cal2avg | cal2max (the other collums from the struct don't matter)
here the code for manually entered files (works)
%%extract validation info from one file%%
%enter filename
%note: if you have more (or less) than 2 validations per .txt file you need.
%to adapt the code at the marked spot
text = fileread('001_p2_2021-03-11_11-17-21_Session_Data.txt');
TextAsCells = regexp(text, '\n', 'split');
%search for the line(s) of interest
mask = ~cellfun(@isempty, regexp(TextAsCells, '!CAL VALIDATION HV9 L LEFT'));
line = TextAsCells(mask);
%if there is only one line of interst
if size(line) == [1 1]
cal1 = regexp(line{1,1}, '(-)?\d+(\.\d+)?(e(-|+)\d+)?','match');
%avg is always the 3rd element in the cell
cal1avg = cal1{1,3};
%max is always the 4th element in the cell
cal1max = cal1{1,4};
cal2avg = 0;
cal2max = 0;
%if there are two lines of interest
else if size(line) == [1 2]
cal1 = regexp(line{1,1}, '(-)?\d+(\.\d+)?(e(-|+)\d+)?','match');
cal2 = regexp(line{1,2}, '(-)?\d+(\.\d+)?(e(-|+)\d+)?','match');
cal1avg = cal1{1,3};
cal1max = cal1{1,4};
cal2avg = cal2{1,3};
cal2max = cal2{1,4};
%if something went wrong, i.e. the worng line is chosen
else
disp("error")
end
end
code from the loop I tried to code (does not work) (no error, just nothing happens)
data = dir('*.txt');
for i = 1:length(data)
file = data(i).name;
text = fileread(file);
TextAsCells = regexp(text, '\n', 'split');
mask = ~cellfun(@isempty, regexp(TextAsCells, '!CAL VALIDATION HV9 L LEFT'));
line = TextAsCells(mask);
cal1 = regexp(line{1,1}, '(-)?\d+(\.\d+)?(e(-|+)\d+)?','match');
cal2 = regexp(line{1,2}, '(-)?\d+(\.\d+)?(e(-|+)\d+)?','match');
data(i).cal1avg = cal1{1,3};
data(i).cal1max = cal1{1,4};
data(i).cal2avg = cal2{1,3};
data(i).cal2max = cal2{1,4};
end
I can't share the txt file(s) because they include personal data from the experiment (btw these are eye-tracker data). The files contain text and numbers and they are pretty random (so no matrix or sth). The goal is to show the 4 values (cal1avg, cal1max, ...) for each filename.
Help would be awesome!
Thank you very much!
Best,
Tim
5 个评论
Jiri Hajek
2022-11-10
Hi, it's really difficult to understand what exactly is your problem. Did you try to debug the code using a breakpoint and stepping through the individual commands? Please tell us, which line of your code does not produce the desired result...
回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Lighting, Transparency, and Shading 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!