How to extract specific data from a .txt file

2 ビュー (過去 30 日間)
Abubakar Rashid
Abubakar Rashid 2023 年 1 月 31 日
コメント済み: Voss 2023 年 2 月 1 日
Hi Everyone,
I am trying to extract certain data which is location specific from a .txt file. The text file is not uniformly arranged & contains all kind of characters.
In my case I am looking to extract value of Fx & Fy in row 17 of the FILE.txt file. I have also attached the .txt file.
Looking forward to get it resolved.
Thank you & Reagrds,

採用された回答

Voss
Voss 2023 年 1 月 31 日
type FILE.TXT % show the contents of FILE.TXT, for reference
******************************************************************************* BCASE=1, RPM: 0.1000E+05 FREQ: 0.1667 [Hz] PS,PA: 2.758 2.758 [bar] ******************************************************************************* ------------------------------------------------- Option (32): Ex,Ey: Centered or Off-centered seal ------------------------------------------------- +-----------------------------------------------------------------------------+ |HsealH=> SOLN.FOUND IN 86 Iter | | Ex=0.050,Ey=-.050; Ec=0.071; Ax= 0.0000E+00,Ay= 0.0000E+00 ZO= 0.1511E-01| | rpm= 0.10000E+05 PS= 0.27579E+06 PA= 0.27579E+06 Cseal= 0.00000E+00 | +-----------------------------------------------------------------------------+ | Exo=0.05000, Eyo=-.05000 Preload d/C=0.00000 | | Mass Flow= 0.22167E-06 Kg/s = 0.13300E-04 Kg/min | | Mass Flow/Rhos= 0.16729E-04 lt/min | +-----------------------------------------------------------------------------+ | FX= 0.21993E+03 N ; FY= 0.21822E+03 N LOAD= 0.30982E+03 N;Angle= 224.78D| +-----------------------------------------------------------------------------+ | MX=-0.11444E-01 Nm; MY= 0.11704E-01 Nm | +-----------------------------------------------------------------------------+ | Torque on Film Lands= 0.42679E+00 N-m | +-----------------------------------------------------------------------------+ ...............................................................................
data = readlines('FILE.TXT'); % read the file
Here's one way to get the values of FX and FY from line 17:
line_to_get = 17;
result = regexp(data{line_to_get},'(\w+)= ?([\.\dE+-]+)','tokens');
result = vertcat(result{:})
result = 4×2 cell array
{'FX' } {'0.21993E+03'} {'FY' } {'0.21822E+03'} {'LOAD' } {'0.30982E+03'} {'Angle'} {'224.78' }
result = str2double(result(ismember(result(:,1),{'FX','FY'}),2))
result = 2×1
219.9300 218.2200
The same regular expression can be used to get other stuff out of the file too:
line_to_get = 10;
result = regexp(data{line_to_get},'(\w+)= ?([\.\dE+-]+)','tokens');
result = vertcat(result{:})
result = 6×2 cell array
{'Ex'} {'0.050' } {'Ey'} {'-.050' } {'Ec'} {'0.071' } {'Ax'} {'0.0000E+00'} {'Ay'} {'0.0000E+00'} {'ZO'} {'0.1511E-01'}
line_to_get = 11;
result = regexp(data{line_to_get},'(\w+)= ?([\.\dE+-]+)','tokens');
result = vertcat(result{:})
result = 4×2 cell array
{'rpm' } {'0.10000E+05'} {'PS' } {'0.27579E+06'} {'PA' } {'0.27579E+06'} {'Cseal'} {'0.00000E+00'}
You would use str2double to convert what you need from the second columns of those cell arrays into numbers.
  7 件のコメント
Voss
Voss 2023 年 2 月 1 日
result = regexp(data{line_to_get},'(\w+)= ?([\.\dE+-]+)','tokens');
Uses regexp to match the regular expression, '(\w+)= ?([\.\dE+-]+)'.
Here's a breakdown of that regular expression:
(\w+)= ?([\.\dE+-]+)
% ^^^ match 1 or more alphabetic, numeric, or underscore character(s)
% ^ followed by an equal sign
% ^^ followed by an optional space
% ^^^^^^^^^^ followed by one or more: periods (\.), decimal digits (\d), capital "E"s, plus signs (+), and/or minus signs (-)
% ^ ^ use parentheses to capture and return the parameter name
% ^ ^ use parentheses to capture and return the parameter value
Line 18 looks like this:
+-----------------------------------------------------------------------------+
so it should not match that regular expression. In other words, it's not surprising that regexp returned no matches with that line.
Note that you can use that same regular expression on the contents of the entire file to capture all the parameter names and values, as I showed in the first comment to my answer.

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2023 年 1 月 31 日
filename = 'FILE.TXT';
S = fileread(filename);
XY = str2double(regexp(S, '(?<=F[XY]= )\S+', 'match'))
XY = 1×2
219.9300 218.2200
  3 件のコメント
Abubakar Rashid
Abubakar Rashid 2023 年 1 月 31 日
Okay thank you!
I highly appreciate your efforts. It makes a lot of sense now

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeText Files についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by