memmapfile 是为读取二进制文件而设计的,这就是您在处理文本文件时遇到问题的原因。那里的数据是字符,因此您必须将它们作为字符读取,然后将它们解析为数字。更多内容如下。
二进制文件似乎不仅仅包含以二进制格式写入的浮点值流。我也在文件中看到标识符(字符串)和其他内容。您阅读该文件的唯一希望是联系创建二进制文件的设备制造商,并询问他们如何读取此类文件。可能会有一个 SDK,或者至少是格式的描述。您可能需要对此进行调查,因为您的文本文件中的浮点数可能会被截断,也就是说,与直接读取浮点数的二进制表示相比,您会丢失精度。
好的,那么如何使用memmapfile 读取您的文件? This post 提供了一些提示。
首先我们以'uint8' 的形式打开您的文件(注意没有'char' 选项,因此作为一种解决方法,我们将文件内容读入相同大小的数据类型):
m = memmapfile('RTL5_57.txt','Format','uint8'); % uint8 is default, you could leave that off
我们可以通过将读取的数据转换为 char 来将读取的 uint8 数据渲染为字符:
c = char(m.Data(1:19)).' % read the first three lines. NB: transpose just for getting nice output, don't use it in your code
c =
0.398516 0.063440
0.399611 0.063284
0.398985 0.061253
由于文件中的每一行都具有相同的长度(数字为 2*8 个字符,换行符为 1 个制表符,换行符为 2 个字符 = 19 个字符),我们可以通过读取 N*19 值从文件中读取 N 行.所以m.Data(1:19) 给你第一行,m.Data(20:38) 第二行,m.Data(20:57) 第二和第三行。一次读多少就读多少。
然后我们必须将读入的数据解析成浮点数:
f = sscanf(c,'%f')
f =
0.3985
0.0634
0.3996
0.0633
0.3990
0.0613
现在剩下的就是将它们重塑为两列格式
d = reshape(f,2,[]).'
d =
0.3985 0.0634
0.3996 0.0633
0.3990 0.0613
比使用memmapfile更简单的方法:
您不需要使用memmapfile 来解决您的问题,而且我认为这会使事情变得更加复杂。您可以简单地使用fopen 后跟fread:
fid = fopen('RTL5_57.txt');
c = fread(fid,Nlines*19,'*char');
% now sscanf and reshape as above
% NB: one can read the values the text file directly with f = fscanf(fid,'%f',Nlines*19).
% However, in testing, I have found calling fread followed by sscanf to be faster
% which will make a significant difference when reading such large files.
使用它,您可以一次读取Nlines 值对,处理它们,然后再次调用fread 以读取下一个Nlines。 fread 记住它在文件中的位置(就像 fscanf 一样),所以只需使用相同的调用来获取下一行。因此很容易编写一个循环来处理整个文件,如果您在文件末尾,请使用feof(fid) 进行测试。
建议使用更简单的方法here:使用textscan。稍微修改他们的示例代码:
Nlines = 10000;
% describe the format of the data
% for more information, see the textscan reference page
format = '%f\t%f';
fid = fopen('RTL5_57.txt');
while ~feof(fid)
C = textscan(fid, format, Nlines, 'CollectOutput', true);
d = C{1}; % immediately clear C at this point if you need the memory!
% process d
end
fclose(fid);
再次注意,fread 后跟 sscanf 将是最快的。但是请注意,只要文本文件中有一行与您的格式不完全匹配,fread 方法就会终止。另一方面,textscan 可以容忍空白更改,因此更加健壮。