我想请求您提供以下帮助: 我有几个结构保存在.txt文件中,我想在matlab中读取它们并保存在一个方便的类型中,以便稍后将它们加载到.mat文件中。我一直在网上搜索找到一个解决方案,但我得到的是有关阅读专栏,特定字符串的信息...但我不能将它结合起来得到我想要的答案。任何帮助赞赏! 非常感谢!
这里的代码我正在努力:
struct
studentname: joe
notes:
n1 = 1.3
n2 = 2.0
average =1.7
endstruct
struct
studentname : marc
notes:
n1 = 2.3 %commentary, to be ommitted while reading from the file
n2 = 3.0
average = 2.7
endstruct
答案 0 :(得分:3)
这是一个完整的解决方案(类似于@Marc描述的内容):
%# read lines
fid = fopen('file.txt','rt');
C = textscan(fid, '%s', 'Delimiter',''); C = C{1};
fclose(fid);
%# start/end of each structure
startIdx = find(ismember(C, 'struct'));
endIdx = find(ismember(C, 'endstruct'));
%# array of strucutres
N = numel(startIdx);
arr = struct('studentname','', 'notes','', 'n1',0, 'n2',0, 'average',0);
arr = repmat(arr,[N 1]);
%# parse and store each structure in the array
for i=1:numel(startIdx)
%# parse key/value of struct
s = C(startIdx(i)+1:endIdx(i)-1);
s = regexp(s, '(\w+)\s*[:=]\s*([^%$]*)(?:%[^$]*)?', 'tokens', 'once');
s = vertcat(s{:});
%# try to parse as numbers
v = str2double(s(:,2));
s(~isnan(v),2) = num2cell(v(~isnan(v)));
%# store: struct.key = value
for j=1:size(s,1)
arr(i).(s{j,1}) = s{j,2};
end
end
结果:
>> arr(1)
ans =
studentname: 'joe'
notes: ''
n1: 1.3
n2: 2
average: 1.7
>> arr(2)
ans =
studentname: 'marc'
notes: ''
n1: 2.3
n2: 3
average: 2.7
当然这假设文件格式正确(struct / endstruct块,所有结构包含相同的字段,字段类型一致)
代码首先将文件行读入单元格数组。然后我们查找struct / endstruct结构的开始/结束位置。我们使用一些默认值初始化一个空的结构数组,然后我们遍历解析每个块的文件,并将该信息存储在一个结构中。
接下来,我们使用regular expression来检测以下模式:
some_key_name = some value % optional comment here
我们允许空格中的某些变体,并且还接受=
或:
作为其间的字符。我们在regexp中使用捕获令牌来恢复上面的每个组件,并将它们存储在临时单元阵列中。此时,所有内容都存储为字符串。
现在实际值可以是数字或字符串。我们最初尝试使用STR2DOUBLE将它们解析为数字。如果失败,此函数将返回NaN
,我们仅使用它来更改已成功转换的部分。
最后通过上面的结果,我们使用动态字段名称将每个值存储在结构数组中的相应键中。
答案 1 :(得分:1)
不幸的是,你基本上不得不自己动手。你可以从fileread()
开始,它将整个文件读成一个字符串,然后逐行阅读,可能使用regexp()
或strfind()
来解析每一行,然后最后使用{{} 3}}或struct()
来构建你的结构。
未经测试,不完整但粗略的想法(假设文件格式正确 - 您需要添加支票):
%read file
wholeFile = fileread(myfilename);
%find starts & ends:
starts = strfind(wholeFile, 'struct');
ends = strfind(wholeFile, 'endstruct');
For i = 1:numel(starts);
rawStruct = wholeFile(starts(i)+7, ends(i)-2);
%parse line by line getting field names using the string "rawStruct"
out(i).(fieldname) = content;
end
答案 2 :(得分:-2)
您可以尝试从Matlab文件交换XML_io_tools。它可以将XML文件解析为matlab结构,反之亦然。