我有一个相当大的文本文件(超过16,000行),其格式如下:
#ID #Line Num #Var Col Length Values (HEX):
45 00001 FFFF FFFF 0000 0000
45 00002 0000 0000 FFFF FFFF
47 00003 AAAA 1111 AAAA 1111 AAAA 1111
49 00004 BBBB 2222
注意:这显然是由数据组成的,因为实际文件中有更多的HEX值。
在Matlab中,我尝试使用单行的textscan
命令:
fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
values = textscan(readLine(pos+1:end), '%x');
我收到格式错误的字符串错误。我假设textscan
不支持十六进制值的转换。我也试过这里找到的解决方案:
Problem (bug?) loading hexadecimal data into MATLAB
但这似乎也不起作用。我试图避免单独转换每个Hex值(有点我现在已经实现的解决方案),因为这需要很长时间。如何从文本文件中扫描/解析可变列宽十六进制值?
答案 0 :(得分:3)
您可以改为使用sscanf
:
fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
results = sscanf(readLine, '%x');
这将为您提供十进制的转换十六进制值列。如果您需要单行中的值,只需转置它:
results = results'
这假设前两个术语也是十六进制值。如果需要将前两个值分隔为double,则其余的十六进制执行以下操作:
fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
results = sscanf(readLine(pos+1:end), '%x');
答案 1 :(得分:2)
您可以使用以下方法将文本文件读入字符串的单元格数组,并使用regexp
将其拆分为单独的值:
fp = fopen(filePath, 'rt');
C = textscan(fp, '%s', 'CommentStyle', '#', 'Delimiter', '');
C = regexp(C{:}, '\w+', 'match');
fclose(fp);
这应该会产生一个单元格数组的单元格数组,对于您的示例,它将如下所示:
C =
{'45' '00001' 'FFFF' 'FFFF' '0000' '0000'}
{'45' '00002' '0000' '0000' 'FFFF' 'FFFF'}
{'47' '00003' 'AAAA' '1111' 'AAAA' '1111' 'AAAA' '1111'}
{'49' '00004' 'BBBB' '2222'}
您可以根据自己的喜好操作生成的单元格数组。例如,丢弃每行中的前两列,并将所有内容转换为十进制:
result = cellfun(@(x)hex2dec(x(3:end)), C, 'UniformOutput', false)