How can I get only damping and frequency column?
3 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Mathieu NOE
2022 年 6 月 15 日
hello
can you zip the file and try to share it (maybe with Google drive or alike)
採用された回答
Karim
2022 年 6 月 15 日
編集済み: Karim
2022 年 6 月 15 日
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 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Text Data Preparation についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!