Сканирование текста для чтения с неизвестным количеством переменных и неизвестным количеством прогонов

Я пытаюсь прочитать файл 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);

У кого-нибудь есть предложение?


person user1543042    schedule 22.08.2013    source источник


Ответы (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);
person Gordon Bean    schedule 22.08.2013

Для любого данного файла все строки имеют одинаковую длину? Если это так, вы можете начать с чтения первой строки и использовать ее для подсчета количества полей, а затем использовать 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);

Теперь у вас будет массив ячеек, где первая запись — это имена переменных, а все остальные — наблюдения.

В этом случае я предположил, что разделителем был пробел, хотя вы сказали, что это файл csv. Если это действительно запятые, вы можете соответствующим образом изменить код.

person ivan    schedule 22.08.2013