从MATLAB文件中读取多个数据

时间:2015-10-06 11:32:16

标签: matlab

我目前正在尝试从这样写的文本文件中读取数据:

Height = 10
Length = 10
NodeX = 11
NodeY = 11
K = 10

我写了一个像这样的小代码

fileID = fopen('input.dat','r');
[a, b] = fscanf(fileID, '%s %f')

我得到以下答案:

a =

    72
   101
   105
   103
   104
   116


b =

     1

似乎很明显我没有指定格式规范。 我想知道如何在同一个文件中多次选择一个字符串和一个浮点数。

2 个答案:

答案 0 :(得分:2)

fscanf函数是一个低级I / O函数,通常不是这种高级文件输入的最佳选择。另一种方法是使用textscan函数,它允许非常高级的格式规范:

fileID = fopen('input.dat','r');
C = textscan(fileID,'%s = %d')

创建1x2单元阵列。第一个单元格C{1}包含另一个5x1单元格,其中每个字段包含字段的名称,例如'Height'。第二个单元C{2}包含一个5x1向量,其中包含文件中的所有整数值。

答案 1 :(得分:2)

fscanf状态为the documentation

  

如果formatSpec包含数字和字符的组合   说明符,然后fscanf将每个字符转换为其数字   当量。即使格式明确,也会发生此转换   跳过所有数值(例如,formatSpec'%*d %s')。

MATLAB在阅读混合数据类型时会非常糟糕。一种可能的替代方法是读取每一行并使用简单的正则表达式分割数据:

fileID = fopen('results.txt','r');

mydata = {};
ii = 1;
while ~feof(fileID) % While we're not at the end of the file
    tline = fgetl(fileID); % Get next line
    mydata(ii,:) = regexp(tline, '([a-zA-Z])* = (\d*)', 'tokens');
    ii = ii + 1;
end

fclose(fileID);

这将返回一个5 x 1单元格数组,其中每个单元格包含与您的数据匹配的2个单元格(稍微烦人,但您可以将其拉出)。在这种情况下,mydata{1}{1}Heightmydata{1}{2}10

编辑:

您可以通过reshape调用来展平您的手机阵列:

mydata = reshape([mydata{:}], 2, [])';

在这种情况下,mydata变为5x2单元格数组。

相关问题