How can I get only damping and frequency column?

My aim is to extract only numeric values in Damping and Frequency column only. The file, from which I am trying to extract data is very large and contains special character, numbers, text and empty lines. Can anyone please suggest me an efficient way to extract the required data?
I hope the images below gives you a better understanding of the data file. Thanks in advance!!

2 Commenti

hello
can you zip the file and try to share it (maybe with Google drive or alike)
Milind Amga
Milind Amga il 15 Giu 2022
Modificato: Milind Amga il 15 Giu 2022
Here you go :text_file (file has been unlinked later)
You can use notepad to open this file.

Accedi per commentare.

 Risposta accettata

Karim
Karim il 15 Giu 2022
Modificato: Karim il 15 Giu 2022
Hi,
One approach is to read the whole file, seek some specific line, from that line read the data with a delimiter.
See below for the code, note that i changed the extention to .txt in order to run the demo on the site. It will work fine if you chage the fileID to 'flutter_2d_rh_wing_base.f06'
Best regards
fileID = fopen('flutter_2d_rh_wing_base.f06.txt');
% read the whole file, interpret each line as a string
MyText = textscan(fileID, '%s%[^\n\r]', 'Delimiter', '', 'WhiteSpace', '', 'ReturnOnError', false);
% convert the cell array into a string array, for easier indexing
MyText = string(strtrim(MyText{1}));
% use some logic to find the usefull data blocks
% first the start locations
StartLineIdx = contains(MyText, "KFREQ 1./KFREQ VELOCITY DAMPING FREQUENCY COMPLEX EIGENVALUE");
StartLineIdx = find(StartLineIdx) + 1;
% now find the stop locations of each data block
StopLineIdx = contains(MyText, "1 MSC.NASTRAN JOB CREATED ON");
StopLineIdx = find(StopLineIdx) - 1;
% remove some indices that occur before the first start index
StopLineIdx(StopLineIdx<StartLineIdx(1)) = [];
% convert the locations into a single logical array
GetMe = false(size(MyText,1),1);
for i = 1:numel(StartLineIdx)
GetMe(StartLineIdx(i):StopLineIdx(i)) = true;
end
% extract the usefull strings from the data
MyData = MyText(GetMe);
% exchange double spaces into a single space
MyData = regexprep(MyData, '\s+', ' ');
% use the spaces to split each string
MyData = split(MyData,' ');
% convert the strings into a numeric array
MyData = str2double(MyData);
% extract the columns of intrest
MyDamp = MyData(:,4);
MyFreq = MyData(:,5);

6 Commenti

Thank You very much !! I really appreciate your help. It works just like I wanted it to.
If possible, could you please explain me the code? I understood most of it but I still have few doubts like in textscan line, two lines just before the loop and loop as well.
i've added some comments, does this help?
Yes, thanks so much.
@KASR Could you please remove the txt file that you have attached in your previous response.
yes sure, i only added it so that the demo code would work.

Accedi per commentare.

Più risposte (0)

Prodotti

Release

R2020b

Richiesto:

il 15 Giu 2022

Commentato:

il 17 Giu 2022

Community Treasure Hunt

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

Start Hunting!

Translated by