How to import data of the form [variable name]Data[-]

I want to read data and variables from a specially formatted file as MATLAB variables. Preferably into a structure.
I am looking for the best approach for a quick solution. unfortunately I am stuck. Maybe someone can give me a helpful hint.
Data in the file have the strucktur:
[variable name]
data
[-]
[variable name]
x1 y1
x2 y2
x3 y3
[-]
A shortened example file:
Instrument Name
File Format Version
[DateTime]
1643810991
[-]
[GenParams]
[CableID]
[-]
[FiberID]
[-]
[FiberType]
0
[-]
[Settings]
[Wavelength]
1
[-]
[PulseWidth]
7
[-]
[End]
35.000
[-]
[Start]
0.000
[-]
[DataPoints]
0.011 -5.000
0.011 -5.000
0.036 -5.000
0.061 -5.000
[-]

6 Comments

What have you tried so far?
It seems like you should split your text on the [-] lines. How did you try to parse each of those segments to struct fields? It looks to me like some have 2 names or don't have data. How do you want to deal with those?
I tried to read it as csv and set different kinds of separators. This obviously does not work well.
How do I do that? "How did you try to parse each of those segments to struct fields?" Sounds like a good approach.
Your data is much too mixed to read as a csv. That works best if you have a single array (with or without some fixed number of header lines).
Before you spend a long time to make a parser, check if your instrument manufacturer has a way to convert or export the data in another more familiar format. Google, maybe someone already parsed it.
Of course, I've already looked at the manufacturer, who doesn't provide anything. the company is also far too small and the product far too niche. I will have to tackle the task myself.
I haven't built a praser yet. now I'm looking for information how to do that
@Simon Dengler: please upload a sample file by clicking the paperclip button.

Sign in to comment.

 Accepted Answer

rgx = '\[(\w+)\]\s*([^\[]+)\[\-\]';
str = fileread('test.txt');
tkn = regexp(str,rgx,'tokens');
tkn = vertcat(tkn{:});
tmp = cellfun(@str2num,tkn(:,2),'uni',0);
out = cell2struct(tmp,tkn(:,1),1);
out.DateTime = datetime(out.DateTime,'ConvertFrom','posix')
out = struct with fields:
DateTime: 02-Feb-2022 14:09:51 CableID: [] FiberID: [] FiberType: 0 Wavelength: 1 PulseWidth: 7 End: 35 Start: 0 DataPoints: [4×2 double]
out.DataPoints
ans = 4×2
0.0110 -5.0000 0.0110 -5.0000 0.0360 -5.0000 0.0610 -5.0000

1 Comment

Thank you very much!! That's perfect, and so wonderfully simple.

Sign in to comment.

More Answers (0)

Categories

Find more on Data Import and Analysis 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!