在MATLAB中读取混合文本文件

时间:2017-03-28 17:27:46

标签: string matlab text filereader

我有一个包含数字和字符的文本文件,更重要的是,它还有*,这意味着重复。例如:

data
-- comment
34*0.00 0.454 0.223 
0.544 5*4.866 
/

以上示例从34zeros0.00开始,然后是0.454然后是0.223,然后是0.544和{{ 1 {} 5重复。这意味着它具有4.866个数值。编写可以读取此类文本文件的通用代码的最佳方法是什么?文本文件中没有其他任何内容;只有数字是相关的。

1 个答案:

答案 0 :(得分:2)

第一步是读取数据。我假设你文件的内容是这样的:

-- comment
34*0.00 0.454 0.223 
0.544 5*4.866 

对于该格式,您可以使用textscan,如下所示:

fid = fopen('data.txt');
data = textscan(fid, '%s', 'CommentStyle', '--');
fclose(fid);
data = data{1};

显示时data将如下所示:

data =

  5×1 cell array

    '34*0.00'
    '0.454'
    '0.223'
    '0.544'
    '5*4.866'

现在,有几种不同的方法可以尝试将其转换为您需要的格式的数字数据。一种(可能是可怕的)方式是使用regexprep,如下所示:

>> data = regexprep(data, '([\d\.]+)\*([\d\.]+)', ...
                    '${repmat([$2 blanks(1)], 1, str2num($1))}')

data =

  5×1 cell array

    '0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0…'
    '0.454'
    '0.223'
    '0.544'
    '4.866 4.866 4.866 4.866 4.866 '

如您所见,它会根据需要复制每个字符串。现在,我们可以将单元格数组的每个单元格转换为数值,并使用cellfunstr2num将它们全部连接在一起:

>> num = cellfun(@str2num, data, 'UniformOutput', false);
>> num = [num{:}]

num =

  Columns 1 through 14

         0         0         0         0         0         0         0         0         0         0         0         0         0         0

  Columns 15 through 28

         0         0         0         0         0         0         0         0         0         0         0         0         0         0

  Columns 29 through 42

         0         0         0         0         0         0    0.4540    0.2230    0.5440    4.8660    4.8660    4.8660    4.8660    4.8660