MATLAB Answers

How can I export only specific data from a text file to a matrix?

2 views (last 30 days)
Caleb Sanders
Caleb Sanders on 24 Jul 2019
Edited: Jan on 26 Jul 2019
I'm need to import only the numeric data of the attached .txt file into a 9x8 matrix and I'm not sure how to do this. Any help is greatly appreciated!

  3 Comments

Adam Danz
Adam Danz on 24 Jul 2019
I see several sections of numeric data, one of which is a 9x8 matrix. Where does the 2x2 come from?
Also do all of the text files follow this exact same format? For example is ":Solar_Radio_Flux" always on the 8th line?
dpb
dpb on 24 Jul 2019
What Adam said...
But, it's generally simpler to read what section of a file contains the info of interest and then just throw out what you don't need than it is to specifically hunt and peck through a file reading a bit here and there.
But, it certainly isn't at all clear what you want to retrieve from this file given the question wording...
Caleb Sanders
Caleb Sanders on 25 Jul 2019
My bad! I'm not sure where I got 2x2 from either lol, it was late in the day when I posted. I'm looking to grab that 9X8 matrix and import into MATLAB. And yes Adam, I believe the text files follow this exact same format.

Sign in to comment.

Accepted Answer

Jan
Jan on 25 Jul 2019
Edited: Jan on 26 Jul 2019
With some guessing, that you want the part behind ':Solar_Radio_Flux:' :
Key = ':Solar_Radio_Flux:';
Str = fileread(FileName);
C = strsplit(Str, newline);
index = find(strncmp(C, Key, numel(Key)));
Block = C(index+3:index+11);
BlockStr = sprintf('%s ', Block{:}); % Horizontal concatenation
% Data = sscanf(BlockStr, '%g ', [9, 8]); [EDITED:]
Data = sscanf(BlockStr, '%g ', [8, 9])'; % Thanks Adam
This can be expanded e.g. to read the 2 header lines also or to accept any block of numbers until the next comment line.

  2 Comments

Caleb Sanders
Caleb Sanders on 25 Jul 2019
Thanks so much! Time for me to try and figure out what this means:)
Adam Danz
Adam Danz on 25 Jul 2019
That last line should be
Data = sscanf(BlockStr, '%g ', [8, 9])';

Sign in to comment.

More Answers (1)

Adam Danz
Adam Danz on 25 Jul 2019
rows = 11:19; % NUMERIC ROWS IN TEXT FILE TO IMPORT
nColumns = 8; % NUMBER OF COLUMNS OF TEXT
file = 'Testdata.txt'; % THE FULL PATH WOULD BE BETTER
opts = delimitedTextImportOptions('NumVariables',nColumns,'DataLines',rows([1,end]),'Delimiter', " ", ...
'VariableTypes',repmat({'double'},1,nColumns),'ConsecutiveDelimitersRule','join',...
'LeadingDelimitersRule','ignore');
Testdata = readtable(file, opts);
Testdata = table2array(Testdata);
Result
Testdata =
245 14 12 11 -1 -1 -1 -1
410 25 28 26 -1 -1 -1 -1
610 34 -1 34 -1 -1 -1 -1
1415 45 49 55 -1 -1 -1 -1
2695 104 -1 68 -1 -1 -1 -1
2800 -1 -1 -1 68 68 -1 -1
4995 107 113 126 -1 -1 -1 -1
8800 223 230 218 -1 -1 -1 -1
15400 519 549 496 -1 -1 -1 -1

  5 Comments

Show 2 older comments
Adam Danz
Adam Danz on 25 Jul 2019
@madhan ravi, it's the same. That's the only line in the table2array function. Matlab's import data tool uses table2array() which is why I ended up using it, too. But I agree that Testdata{:,:} is more direct.
Jeremy Hughes
Jeremy Hughes on 25 Jul 2019
Or if you have R2019a
Testdata = readtable(file, opts);
Testdata = table2array(Testdata);
can just be
A = readmatrix(file,opts)

Sign in to comment.

Sign in to answer this question.

Tags