【问题标题】:MATLAB Parse Data fileMATLAB 解析数据文件
【发布时间】:2017-06-26 12:32:47
【问题描述】:

我有一个包含多行标题和开销信息的文本文件。然后,在此之后,我有兴趣捕获重复的数据块。但是,第一个块与后面的块有点不同。文件结构如下:

**Header and overhead:**
...
...
...
SPD -> PX: SS3Data[07]: Recv Data
Sync:     0xXXXXXXXX
Chan:     N
ID:       N
Seq:      N
SS:       N
Words:    N
Time:     0xXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX
PX: SS3Data[07]: Recv Data
Sync:     0xXXXXXXXX
Chan:     N
ID:       N
Seq:      N
SS:       N
Words:    N
Time:     0xXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX
PX: SS3Data[07]: Recv Data
Sync:     0xXXXXXXXX
Chan:     N
ID:       N
Seq:      N
SS:       N
Words:    N
Time:     0xXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX

我希望能够捕获所述块中的数据并将它们存储在如下结构中:

S.Block1.Sync
S.Block1.Chan
S.Block1.Chan
S.Block1.ID
S.Block1.Seq
S.Block1.SS
S.Block1.Words
S.Block1.Time
S.Block1.Data
.
.
.
S.BlockN.Sync
S.BlockN.Chan
S.BlockN.Chan
S.BlockN.ID
S.BlockN.Seq
S.BlockN.SS
S.BlockN.Words
S.BlockN.Time
S.BlockN.Data

时间字段后面的 X 是十六进制字符。第一行64个字符,第二行32个。

【问题讨论】:

    标签: matlab file parsing


    【解决方案1】:

    解决此问题的最佳方法取决于文件的大小。如果您可以一次阅读全部内容,我建议您使用以下方法 textscan()

    % read file => stored in "data.txt"
    fID = fopen(fullfile(cd, 'data.txt'), 'r');
    tmp = textscan(fID, '%s');
    fclose(fID);
    lines = tmp{1};
    
    % find rows with data. You might want to add some additional checks, or
    % check whether the labels are indeed always in this order
    chan_row = find(strcmpi(lines, 'Chan:'))+1; % could add a check here that the distance between the rows is all the same
    
    % save in a table
    tbl = table();
    tbl.Chan = lines(chan_row);
    tbl.ID = lines(chan_row+2);
    tbl.Seq = lines(chan_row+4);
    tbl.SS = lines(chan_row+6);
    tbl.Words = lines(chan_row+8);
    tbl.Time = lines(chan_row+10);
    tbl.Data = lines(chan_row+12);
    

    请注意,我将结果存储在表格中。这可能比名称中带有 id 号的结构更容易处理。对于每个字段,您可能需要进行一些额外的转换,例如将特定字段转换为分类。

    如果由于文件非常大而不可行,您可以尝试结合 fopen() 和 fgetl() 来逐行读取。

    【讨论】:

    • 这在大多数情况下都非常有效。我修改了数据部分: temp_DataLine1 = lines(chan_row+11);和 temp_DataLine2 = 行(chan_row+12);。然后,我 strcat 两个:tbl.Data = strcat(temp_DataLine1,temp_DataLine2).
    【解决方案2】:

    如果这只是一次数据捕获而不是实际代码的一部分,只需 ctrl-c 记事本中的数据,然后在 Matlab 中单击变量工作区和 ctrl-v。它应该会弹出一个窗口,让您可以轻松地导入该数据

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 2014-05-28
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多