1

我正在尝试读取格式为 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);

有人有建议吗?

4

2 回答 2

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);
于 2013-08-22T17:32:19.617 回答
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 文件。如果真的是逗号,您可以相应地更改代码。

于 2013-08-22T17:29:46.347 回答