【问题标题】:How can I read lines with different number of data entries from text file into array in Matlab?如何从文本文件中读取具有不同数量数据条目的行到 Matlab 中的数组中?
【发布时间】:2012-11-15 16:31:28
【问题描述】:

我有一个包含消息和时间戳的文本文件:

 {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中做到这一点?

【问题讨论】:

  • 如果你只需要订购它们,你实际上不需要解析整个字符串,可以在第一个字段之后停止。

标签: matlab file-io


【解决方案1】:

Dennis 说得对,您可能应该进行一些预处理,因为您有多组大括号等。

您可能正在寻找某种基本上对文件行进行排序的方法。如果您不担心捕获单个字符串字段,而只是在重新排序行中,您可以根据第一个字段进行读取和排序,您知道它是数字。这很老套,但也许您正在寻找类似的东西(这基本上是丹尼斯在上面的 cmets 中建议的):

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)

来执行

【讨论】:

    【解决方案2】:

    以下是一些应该可行的步骤:

    0:求每行字段数的上限

    1:确保您有漂亮的矩形数据。查看每行中逗号的数量减去{ 括号的数量。 (不要扣除} 否则您将计算双打)。这为您提供了您拥有的字段数。然后添加逗号,直到每行达到最大值。

    2:将{} 更改为标准文本指示符,如"

    3:使用xlsread() 或类似方法导入结果。

    【讨论】:

    • 如果您的数据集包含讨厌的结构,例如不是分隔符的 {,或者如果文件中出现 ",您将需要通过替换它们来进行一些智能预处理
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2021-09-09
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多