MATLAB Answers

0

Extracting numerical results from a text file at different positions

Gary Styger さんによって質問されました 2019 年 3 月 10 日
最新アクティビティ Gary Styger さんによって コメントされました 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
2019 年 3 月 10 日
read about fileread, regexp

サインイン to comment.

2 件の回答

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 件のコメント

Gary Styger 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.

サインイン to comment.


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
2019 年 3 月 10 日
You can always convert the last column into doubles...
result.Var2 = str2double(result.Var2);
Gary Styger 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.

サインイン to comment.



Translated by