我有一个包含许多标题和开销信息的文本文件。然后,在此之后,我有兴趣捕获重复的数据块。但是,第一个块与其后的块略有不同。文件结构如下:
**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是HEX字符。第一行有64个字符,第二行有32个字符。
答案 0 :(得分:2)
此问题的最佳方法取决于文件的大小。如果您可以一次性阅读,我建议使用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()结合使用来逐行读取。
答案 1 :(得分:0)
如果这只是一次性数据捕获而不是实际上是代码的一部分,只需在记事本中按ctrl-c,然后在Matlab中单击变量工作区和ctrl-v。它应该会打开一个窗口,让您可以轻松地导入该数据