一种解决方案是使用
FSCANF 将文件的整个内容作为字符字符串读取,使用
MAT2CELL 在换行符出现的位置将字符串分割成单独的单元格,使用
STRTRIM 去除端部多余的空格,然后根据需要处理每个单元格中的字符串数据。例如,使用此示例文本文件
'junk.txt'
:
hi
hello
1 2 3
FF 00 FF
12 A6 22 20 20 20
FF FF FF
以下代码将把每一行放入一个单元数组
cellData
的单元格中:
>> fid = fopen('junk.txt','r');
>> strData = fscanf(fid,'%c');
>> fclose(fid);
>> nCharPerLine = diff([0 find(strData == char(10)) numel(strData)]);
>> cellData = strtrim(mat2cell(strData,1,nCharPerLine))
cellData =
'hi' 'hello' '1 2 3' 'FF 00 FF' '12 A6 22 20 20 20' 'FF FF FF'
现在,如果你想将所有十六进制数据(样本数据文件中的第3到6行)从字符串转换为数字向量,可以使用
CELLFUN和
SSCANF,代码如下:
>> cellData(3:end) = cellfun(@(s) {sscanf(s,'%x',[1 inf])},cellData(3:end));
>> cellData{3:end} %# Display contents
ans =
1 2 3
ans =
255 0 255
ans =
18 166 34 32 32 32
ans =
255 255 255
注意:由于你正在处理如此大的数组,你必须注意变量使用的
内存量。上述解决方案是矢量化的,但可能会占用大量内存。当你创建
cellData
时,你可能需要覆盖或
清除像
strData
这样的大变量。另外,你可以循环遍历
nCharPerLine
中的元素,并逐个处理更大的字符串
strData
的每个段落,将其转换为所需的向量,这样你就可以预先分配现在已知有多少行数据(即
nDataLines = numel(nCharPerLine)-nHeaderLines;
)。