我有一个包含消息和时间戳的文本文件:
{193220,message,ucontroller9,controller1,lowalarm,success},
{193220,message,controller1,changer,{change,down},success},
{193220,controlaction,tapchange_down,{oldsetting,0.975},{newsetting,0.95}},
{193220,modelupdate_start,changeup,changer,193220},
{14430,modelupdate_complete},
{278480,message,ucontroller6,controller1,highalarm,success},
{278480,message,controller1,changer,{change,up},success},
...
我想将这些行读入数组并根据第一列重新排序数组。到目前为止,我的方法如下:
fid = fopen('messagestore.txt') % Open file
n=1
while 1
string = fgetl(fid); % get line
if ~ischar(string), break, end % break if end of file
string = strrep(string,'[',''); %
string = strrep(string,']',''); %
string = strrep(string,'{',''); % strip out unwanted characters
string = strrep(string,'}',''); %
string = strrep(string,',',' '); %
string = string(2:end); % remove space at start
MessageArray(:,n) = textscan(string,'%f%s%s%s%s%s'); % format and save into array
n=n+1;
end
fclose(fid)
这部分有效但我在区分不同的消息类型(即字段数)方面存在问题。我猜我可以使用matlab sort
函数,如果我可以正确地将数据放入数组中。
有没有办法在matlab中执行此操作?
答案 0 :(得分:1)
以下是一些应该有效的步骤:
0:找到每行中字段数的上限
1:确保你有漂亮的矩形数据。查看每行中出现的逗号数减去{
括号的数量。 (不要扣除}
或者你将计算双打数)。这将为您提供您拥有的字段数。然后添加逗号,直到每行达到最大值。
2:将{
和}
更改为标准文字指示符,例如"
3:使用xlsread()
或类似内容导入结果。
答案 1 :(得分:1)
Dennis说你可能应该做一些预处理,因为你有多套括号等等。
您可能正在寻找的是基本排序文件行的某种方式。如果您不担心捕获单个字符串字段,而只是在重新排序行中,则可以根据您知道为数字的第一个字段进行读取和排序。这是相当hackish,但也许你正在寻找类似的东西(这基本上是丹尼斯在上面的评论中建议的):
clear all, clc
fid = fopen('messagestore.txt');
n=1;
nums = [];
while 1
string = fgetl(fid); % get line
if ~ischar(string), break, end % break if end of file
for k = 1:length(string)
if string(k) == ','
break
end
end
nums = [nums str2num(string(2:k-1))];
MessageArray{n} = string;
n=n+1;
end
[nums,I] = sort(nums);
MessageArray = MessageArray(I);
fclose(fid);
% Print some output
for k = 1:length(nums)
disp(MessageArray{k})
end
产生
{14430,modelupdate_complete},
{193220,message,ucontroller9,controller1,lowalarm,success},
{193220,message,controller1,changer,{change,down},success},
{193220,controlaction,tapchange_down,{oldsetting,0.975},{newsetting,0.95}},
{193220,modelupdate_start,changeup,changer,193220},
{278480,message,ucontroller6,controller1,highalarm,success},
{278480,message,controller1,changer,{change,up},success}
现在,我不完全确定你的时间戳是如何工作的,在这里我按字面意思对数值进行排序。但是您应该能够从代码中获取基本思想 - 将第一个字段中的数字读入矢量并使用该矢量对行本身进行排序。无论您的时间戳需要什么类型的排序,都可以通过更改[nums,I] = sort(nums)