文本扫描以读取未知数量的变量和未知的运行次数

时间:2013-08-22 16:44:55

标签: matlab textscan

我正在尝试读取格式为

的csv文件
  Var1 Val1A Val1B ... Val1Q
  Var2 Val2A Val2B ... Val2Q
  ...

我不会提前知道文件中有多少变量(行)或多少次运行(列)。

我一直在尝试让文本扫描工作,但无论我尝试什么,我都无法获得所有变量名称被隔离或逐列单元格数组。这就是我一直在尝试的。

  fID = fopen(strcat(pwd,'/',inputFile),'rt');

  if fID == -1
      disp('Could not find file')
      return
  end

  vars = textscan(fID, '%s,%*s','delimiter','\n');
  fclose(fID);

有人有建议吗?

2 个答案:

答案 0 :(得分:2)

如果文件在每行中具有相同的列数(您只是不知道开头有多少列),请尝试以下操作。

首先,通过解析第一行并找到列数来计算出多少列,然后解析整个文件:

% Open the file, get the first line
fid = fopen('myfile.txt');
line = fgetl(fid);
fclose(fid);

tmp = textscan(line, '%s');
% The length of tmp will tell you how many lines
n = length(tmp);

% Now scan the file
fid = fopen('myfile.txt');
tmp = textscan(fid, repmat('%s ', [1, n]));
fclose(fid);

答案 1 :(得分:0)

对于任何给定的文件,所有行都是等长吗?如果是,您可以从第一行开始读取并使用它来计算字段数,然后使用textscan读取文件。

fID = fopen(strcat(pwd,'/',inputFile),'rt');
firstLine = fgetl(fID);
numFields = length(strfind(firstLine,' ')) + 1;
fclose(fID);

formatString = repmat('%s',1,numFields);

fID = fopen(strcat(pwd,'/',inputFile),'rt');
vars = textscan(fID, formatString,' ');
fclose(fID);

现在你将拥有一个单元格数组,其中第一个条目是var名称,所有其他条目是观察结果。

在这种情况下,我假设分隔符是空格,即使你说它是一个csv文件。如果它真的是逗号,您可以相应地更改代码。