3

我有一个相当大的文本文件(超过 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不支持十六进制值的转换。我也尝试了这里找到的解决方案:

将十六进制数据加载到 MATLAB 中的问题(错误?)

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

4

2 回答 2

3

您可以sscanf改用:

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
results = sscanf(readLine, '%x');

这将为您提供一列转换为十进制的十六进制值。如果您需要单行中的值,只需转置它:

results = results'

这假设前两项也是十六进制值。如果您需要将前两个值分隔为双精度,然后将其余的十六进制值分开,请执行以下操作:

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
results = sscanf(readLine(pos+1:end), '%x');
于 2013-03-19T17:02:40.850 回答
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)
于 2013-03-19T16:34:00.183 回答