Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在matlab中读取具有可变十六进制值列的文本文件?_Matlab_Textscan - Fatal编程技术网

如何在matlab中读取具有可变十六进制值列的文本文件?

如何在matlab中读取具有可变十六进制值列的文本文件?,matlab,textscan,Matlab,Textscan,我有一个相当大的文本文件(超过16000行),其格式如下: #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

我有一个相当大的文本文件(超过16000行),其格式如下:

#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 
注意:这显然是虚构的数据,因为实际文件中有更多的十六进制值

在Matlab中,我尝试使用一行的
textscan
命令:

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
values = textscan(readLine(pos+1:end), '%x');
我得到一个格式错误的字符串。我假设
textscan
不支持十六进制值的转换。我还尝试了以下解决方案:


但这似乎也不起作用。我试图避免单独转换每个十六进制值(某种程度上是我现在实现的解决方案),因为这需要很长时间。如何扫描/解析文本文件中的可变列宽十六进制值?

您可以使用以下方法将文本文件读入字符串单元格数组,并使用
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)

您可以改用
sscanf

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
results = sscanf(readLine, '%x');
这将为您提供一列十进制的转换十六进制值。如果需要单行中的值,只需将其转置:

results = results'
这假设前两项也是十六进制值。如果需要将前两个值分别为double和rest hex,请执行以下操作:

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
results = sscanf(readLine(pos+1:end), '%x');

这真是整洁有序。它不逐行处理文件,而是处理整个过程并将其转储到一个组织良好的数据表单中。我害怕使用
hex2dec
,因为我单独调用它时花了很长时间(2米以上的次数和136秒以上),但这要快得多(1秒以下)!