MATLAB Answers

Extracting numerical results from a text file at different positions

2 ビュー (過去 30 日間)
GS76
GS76 2019 年 3 月 10 日
コメント済み: GS76 2019 年 3 月 11 日
I have a number of output files to process, written out from Finite Element Analysis software, from which I need to extract data.
I need to extract data under 2 different "headings" from each of the files. However, each of the files has these headings at different rows. I have attached a "zipped" file with 2 files indicating this problem.
The following screenshots show the "headings" highlighted and the numerical data to be extracted, shown inside a "box":
First Heading
H0.PNG
Second Heading
H2.PNG
I have tried a number of options in Matlab, but I am overwhelmed as I am new to Matlab and programming.
Any assistance and guidance, would be much appreciated.

  1 件のコメント

darova
darova 2019 年 3 月 10 日
read about fileread, regexp

Sign in to comment.

採用された回答

GT
GT 2019 年 3 月 11 日
good catch, my bad:) it was late at night. This should work. In either case if you are learning MATLAB, regexp are very powerful. They exist in many languages, it is worth understanding them:)
a = fileread('0295_PhD_AB~Analysis 1.txt');
% find ( H A R M O N I C = \d )
[b,c] = regexp(a,'( H A R M O N I C = \d )','tokens');
result = table();
% find the 2nd and the 6th number in the table
for i = 1:length(c)
aux = (a(c(i)+586:c(i)+700));
d = regexp(aux,'([0-9.E-+]*)','tokens');
result = [result;table(repmat(b{i},2,1),[d{2};d{6}])];
end
result.Var2 = str2double(result.Var2);

  1 件のコメント

GS76
GS76 2019 年 3 月 11 日
Thank you GT!
This worked out excellently.
I will continue learning and practising "regexp". Thank you for all your help and tips.

Sign in to comment.

その他の回答 (1 件)

GT
GT 2019 年 3 月 10 日
There is probably an easier way to do this... but this should help. (I am using R2018b).
a = fileread('0295_PhD_AB~Analysis 1.txt');
% find ( H A R M O N I C = \d )
[b,c] = regexp(a,'( H A R M O N I C = \d )','tokens');
result = table();
% find
for i = 1:length(c)
aux = (a(c(i)+586:c(i)+700));
d = regexp(aux,'([0-9.E-]*)','tokens');
result = [result;table(repmat(b{i},2,1),[d{2};d{7}])];
end
result

  2 件のコメント

GT
GT 2019 年 3 月 10 日
You can always convert the last column into doubles...
result.Var2 = str2double(result.Var2);
GS76
GS76 2019 年 3 月 11 日
Hi GT,
Thank you very much for this help. This is exactly what I was hoping to achieve.
However, I found the following error whereby the code is extracting the last value from the second column and not the first, when extracting for "HARMONIC = 2". Please see the attached screenshot:
Error.PNG
Could you assist me to correct this small problem in the code.
Thank you again for your assistance.

Sign in to comment.


Translated by