How can i read different data types (strings numbers vectors) from one .txt-File?

2 views (last 30 days)
At the moment i am using a .txt - File for my data input. (Only numbers with 3 columns)
In this .txt-file I want also store all the relevant formating data for my diagram. -> see attachment file. So i can use this parameters in my matlab code. How can i read them?
This was my old matlab code just with my Data Input:
Input_Matrix = textread('InputXX.txt')
[zeilen,spalten]=size(Input_Matrix)
x = Input_Matrix(:,1)
y = Input_Matrix(:,2)
z = Input_Matrix(:,3)
Thank you guys. Sincelery Philipp
  4 Comments
Guillaume
Guillaume on 8 Nov 2016
There are some existing formats such as xml or json that are text (thus human readable / writable) and that matlab can easily parse if you want to be able to write your input data with a text editor. Or you could write a script that generates matlab variables.
Otherwise, the best way to store this sort of things is in a mat file, but of course it's not something that you can write / edit in a text editor.
Note that parsing your file is not that complicated (depending how fault tolerant you want your parser to be).

Sign in to comment.

Accepted Answer

Guillaume
Guillaume on 8 Nov 2016
As per my comment you could use an xml file and xmlread or a json file and jsondecode (the latter being a lot less verbose) but it means a substantial change of syntax for your input file.
It's not that complicated to write a parser for your current format. This would work (although lacking a lot of syntax validation):
diagramoptions = [];
diagramlimits = [];
inputdata = [];
wholecontent = fileread('InputXX.txt');
sections = regexp(wholecontent, '\**([^*]*)\**([^*]*)', 'tokens');
for section = sections
switch(strtrim(section{1}{1}))
case 'Diagram Options'
keyvalues = regexp(section{1}{2}, '([^\n\r=]*)=([^\n\r=]*)', 'tokens');
diagramoptions = cell2table(vertcat(keyvalues{:}), 'VariableNames', {'Key', 'Value'});
case 'Diagram Limits'
header = strsplit(regexp(section{1}{2}, '[^\n\r]*', 'match', 'once'));
content = textscan(section{1}{2}, repmat('%f', 1, numel(header)), 'HeaderLines', 2);
diagramlimits = table(content{:}, 'VariableNames', header);
case 'Input Data'
inputdata = cell2mat(textscan(section{1}{2}, '%f%f%f', 'HeaderLines', 1));
otherwise
warning('Unknown section: %s', section{1}{1});
end
end
%see the outputs
openvar diagramoptions
openvar diagramlimits
openvar inputdata
  5 Comments
Philipp Mueller
Philipp Mueller on 16 Nov 2016
Edited: Philipp Mueller on 16 Nov 2016
@Guillaume ok, i understood thank you :) Last question: For example i have 3 diagrams to plot. That means my inputXX.txt has 9 sections -> 3 times diagram options 3 times input data and 3 times diagram limits. how can i seperate it? Is it possible to use
  • openvar diagramoptions[i]
  • openvar diagramlimits[i]
  • openvar inputdata[i]
i...index -> 1,2 or 3 diagram. Thank you in advance
Guillaume
Guillaume on 16 Nov 2016
The simplest way would be to append to diagramoptions, diagramlimits, inputdata every time you encounter a new one. It's easily done by replacing the assignment with
diagramoptions{end+1} = cell2table(... %same for the other two
You can then index each section using cell array indexing:
openvar diagramoptions{1}

Sign in to comment.

More Answers (0)

Categories

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

Tags

Community Treasure Hunt

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

Start Hunting!