How to read specific lines from a text file and store them in a matrix?

7 views (last 30 days)
Hello everyone,
I want to create a matrix from the attached text file that only includes the lines after the one that reads "Interval: 0.02 sec". Basically, I want a matrix that includes the headers of the columns and all the numeric data from the file, but none of the information preceding it.
Also, would it be possible to use the same code when reading information from a file with a different number or rows and columns?
Thank you!

Accepted Answer

Stephen23
Stephen23 on 12 Jun 2019
Edited: Stephen23 on 12 Jun 2019
This code should work regardless of the number of rows or columns:
opt = {'Headerlines',3, 'CollectOutput',true};
fid = fopen('Example.txt','rt');
tgt = '';
while ~strncmpi(tgt,'Target',6)
tgt = fgetl(fid);
end
itm = textscan(fid,'Item%d%s','Delimiter','=');
fmt = repmat('%f',1,1+numel(itm{1}));
dat = textscan(fid,fmt,opt{:});
fclose(fid);
dat = dat{1};
giving:
>> size(dat)
ans =
12111 17
>> dat
dat =
12110 -66.174 -69.167 -77.607 -74.388 -66.369 -69.19 -77.367 -73.986 -2.6341 -0.046144 0.34017 -0.7492 -1.97 -2.3501 -2.3501 -2.3501
12109 -66.174 -69.167 -77.607 -74.388 -66.369 -69.19 -77.367 -73.986 -2.6341 -0.046144 0.34017 -0.7492 -1.97 -2.3501 -2.3501 -2.3501
12108 -68.547 -72.838 -79.49 -77.035 -68.078 -72.151 -78.954 -75.901 -2.8352 -0.24927 -1.2125 -4.7041 -1.97 -1.97 -2.3501 -2.3501
12107 -68.547 -72.838 -79.49 -77.035 -68.078 -72.151 -78.954 -75.901 -2.8352 -0.24927 -1.2125 -4.7041 -1.97 -1.97 -2.3501 -2.3501
12106 -71.372 -75.556 -80.754 -79.204 -70.49 -74.884 -80.715 -78.217 -3.1016 -3.7407 -1.6364 -2.9571 -1.97 -1.97 -1.97 -1.97
12105 -71.372 -75.556 -80.754 -79.204 -70.49 -74.884 -80.715 -78.217 -3.1016 -3.7407 -1.6364 -2.9571 -1.97 -1.97 -1.97 -1.97
12104 -73.434 -76.856 -83.268 -80.121 -72.997 -76.536 -82.741 -80.363 -3.6008 -0.69239 -1.8817 -4.322 -1.97 -1.97 -1.97 -1.97
12103 -73.434 -76.856 -83.268 -80.121 -72.997 -76.536 -82.741 -80.363 -3.6008 -0.69239 -1.8817 -4.322 -1.97 -1.97 -1.97 -1.97
12102 -75.472 -78.823 -85.593 -82.589 -74.971 -78.008 -84.924 -82.487 0.42387 -1.7753 -2.9945 -1.1647 -1.97 -1.97 -1.97 -1.97
12101 -75.472 -78.823 -85.593 -82.589 -74.971 -78.008 -84.924 -82.487 0.42387 -1.7753 -2.9945 -1.1647 -1.97 -1.97 -1.97 -1.97
... lots more rows here
6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
And some of the header information:
>> tgt
tgt =
Target: 0,31
>> itm{1}
ans =
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>> itm{2}
ans =
'0,31:1.03 SPEED MEASURED 1 [rpm]'
'0,32:1.03 SPEED MEASURED 1 [rpm]'
'0,33:1.03 SPEED MEASURED 1 [rpm]'
'0,34:1.03 SPEED MEASURED 1 [rpm]'
'0,31:1.04 MOTOR SPEED [rpm]'
'0,32:1.04 MOTOR SPEED [rpm]'
'0,33:1.04 MOTOR SPEED [rpm]'
'0,34:1.04 MOTOR SPEED [rpm]'
'0,31:1.08 MOTOR TORQUE [%]'
'0,32:1.08 MOTOR TORQUE [%]'
'0,33:1.08 MOTOR TORQUE [%]'
'0,34:1.08 MOTOR TORQUE [%]'
'0,31:25.04 TORQUE REF B [%]'
'0,32:25.04 TORQUE REF B [%]'
'0,33:25.04 TORQUE REF B [%]'
'0,34:25.04 TORQUE REF B [%]'
  7 Comments
Stephen23
Stephen23 on 13 Jun 2019
Edited: Stephen23 on 13 Jun 2019
"...how exactly I can generate the headers from the cell array itm's contents"
First read the documentation for array2table where it specifies how to specify the table's "variable" names:
Then read the specification of valid variable names:
Are the contents of itm valid variable names? No, the headers contain many invalid characters, and are also not unique. So you will need to remove/replace those invalid characters, and make them unique. You could use any string manipulation tools/functions of your choice, e.g. regexprep, strrep, genvarname, etc., whatever you prefer. Read the documentation and experiment!

Sign in to comment.

More Answers (0)

Categories

Find more on Characters and Strings in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!