Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 将十六进制数据加载到MATLAB中的问题(错误?)

我正在尝试使用load()将以下ascii文件加载到MATLAB中

% some comment 1 0xc661 2 0xd661 3 0xe661 (这实际上是一个简化的文件。我尝试加载的实际文件在开始时包含未定义的列数和未定义的注释行数,这就是为什么加载功能很吸引人的原因)

由于某些奇怪的原因,我得到以下信息:

K>> data = load('testMixed.txt') data = 1 50785 2 58977 3 58977 我观察到,只要十六进制数字中有一个“ d”,就会出现此问题。

直接hex2dec转换正常工作:

K>> hex2dec('d661') ans = 54881 importdata似乎有相同的转换问题,ImportWizard也是如此:

K>> importdata('testMixed.txt') ans = 1 50785 2 58977 3 58977 那是一个错误,我是以某种禁止的方式使用加载功能,还是我明显忽略了某些东西?

是否有解决此问题的方法,而不必自己重新实现文件解析?

编辑我的输入文件以更好地反映我的实际文件格式。我对最初的问题有些过分简化。


回答:
“高尔夫”答案:

这从mtrw的答案开始,并进一步缩短:

fid = fopen('testMixed.txt','rt'); data = textscan(fid,'%s','Delimiter','\n','MultipleDelimsAsOne','1',... 'CommentStyle','%'); fclose(fid); data = strcat(data{1},{' '}); data = sscanf([data{:}],'%i',[sum(isspace(data{1})) inf]).'; 上一个答案:

我的第一个想法是使用TEXTSCAN ,因为它有一个选项,当某些行以给定字符(例如% )开头时,您可以忽略它们。但是,TEXTSCAN似乎不能很好地处理十六进制格式的数字。这是另一个选择:

fid = fopen('testMixed.txt','r'); % Open file % First, read all the comment lines (lines that start with '%'): comments = {}; position = 0; nextLine = fgetl(fid); % Read the first line while strcmp(nextLine(1),'%') comments = [comments; {nextLine}]; % Collect the comments position = ftell(fid); % Get the file pointer position nextLine = fgetl(fid); % Read the next line end fseek(fid,position,-1); % Rewind to beginning of last line read % Read numerical data: nCol = sum(isspace(nextLine))+1; % Get the number of columns data = fscanf(fid,'%i',[nCol inf]).'; % Note '%i' works for all integer formats fclose(fid); % Close file 这将在文件开头处理任意数量的注释。求列数的计算是受Jacob答案的启发。



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:49


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.