чтение форматированных данных из текстового файла в Matlab

Я пытался прочитать некоторые числа из форматированного текстового файла. Я хочу сохранить некоторое количество столбцов из множества столбцов и хочу повторить его до конца файла (несколько строк или строк).

Это код, который я написал для этого, но он считывает только одну строку данных.

fid = fopen ('L0512164529','r+');
num_ints = 47;
num_rows = 50;
features = struct;

format =['L%d,',repmat('%f,' , 1 , num_ints-1),'%f'];
[r_dat,l] = textscan(fid, format, num_rows);
features.name=r_dat{1};
features.bodyposfeat=[r_dat{2:end}];

fclose(fid);

Каждая строка начинается с числа, начиная с L. Первые две строки файла:

L0512164529,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.1376599,-0.4387758,0.4723490,0.751‌​9389,0.4742642,-0.8703301
L0512164529,0.0001816,0.0000005,-0.0005697,-1.0843741,0.0001816,0.0000005,-0.000‌​5697,-1.0843741,0.1433973

person CanCam    schedule 23.11.2015    source источник
comment
Приведите пример первых двух строк вашего файла.   -  person Phil Goddard    schedule 23.11.2015
comment
L0512164529,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.1376599, -0.43877599, -0.4387758 0.4723490,0.7519389 0.4742642, -0.8703301 ..... L0512164529 0.00018160.0000005, -0.0005697, -1.0843741 0.0001816, 0.0000005,-0.0005697,-1.0843741,0.1433973..... Это первые две строки текста. Каждая строка начинается с числа с начальной буквы L.   -  person CanCam    schedule 23.11.2015
comment
Ваши строки имеют переменные столбцы?   -  person excaza    schedule 23.11.2015
comment
Вы также можете попробовать fid = fopen(file), а затем использовать цикл while: while ~feof data(k,:) = fread(fid);k=k+1; end   -  person Adriaan    schedule 24.11.2015
comment
Если в строках разное количество столбцов, то textscan не подходит.   -  person gariepy    schedule 24.11.2015
comment
Насколько велик ваш файл? Мне лень, поэтому я просто делаю t = readtable('somefile.csv');, а затем беру нужные столбцы.   -  person Matthew Gunn    schedule 24.11.2015
comment
На самом деле у меня много строк и столбцов в моем текстовом файле. Я скопировал только несколько примеров в своем комментарии. Позвольте мне прояснить проблему, у меня 1385 строк (строк) и 907 столбцов (без номера L-xxx) я хотите прочитать все строки только с 47 (или некоторым указанным числом) столбцами с помощью textscan.   -  person CanCam    schedule 24.11.2015


Ответы (2)


Убедитесь, что вы используете правильное количество спецификаторов формата %f в строке формата. Похоже, вам, вероятно, нужно использовать следующий оператор формата:

format =['L%d,',repmat('%f,' , 1 , num_ints-2),'%f'];  %% changed to ( num_ints - 2)

предполагая, что num_ints - это количество столбцов. Когда я попробовал ваш код с вашими примерами данных, он сработал, когда я изменил num_ints на 14, поскольку в ваших примерах всего 16 столбцов, а первый указывается отдельно с помощью L%d,. Когда я увеличиваю num_ints выше 14, он анализирует только 1 строку файла.

Итак, чтобы было ясно, если num_ints — это количество столбцов, включая первый столбец с L-именем, то использование num_ints-2 в создании строки формата должно работать.

person gariepy    schedule 23.11.2015
comment
Спасибо за ваш ответ, на самом деле у меня много строк и столбцов в моем текстовом файле. Я скопировал только несколько примеров в своем комментарии. Позвольте мне уточнить проблему, у меня есть 1385 строк (строк) и 907 столбцов (без L-xxx номер) Я хочу прочитать все строки только с 47 столбцами (или с некоторым указанным числом) с помощью textscan. - person CanCam; 24.11.2015
comment
ну, что касается терминологии, если у вас есть переменное количество столбцов (что, похоже, у вас есть), то это важно указать в описании проблемы. Textscan не подойдет вам, если вы хотите пропустить строки, в которых нет 47 столбцов. Я добавлю еще один ответ с простой альтернативой. - person gariepy; 24.11.2015

Вот еще один способ сделать это, если у вас есть переменное количество столбцов в вашем файле.

filename = 'temp.txt'
fid = fopen(filename, 'rt');
if fid < 0
    error('Error opening file %s\n', filename); % exit point
end

desired_number_of_columns = 48;  %% 1 for the name, and 47 for the data
number_of_rows = 1385;  %% data structure won''t have this many rows, because some will be skipped

features.name=zeros(number_of_rows,1);
features.bodyposfeat=zeros(number_of_rows, desired_number_of_columns-1);

cntr = 1
while true
    tline = fgetl(fid);  %% read file one line at a time
    if ~ischar(tline), break; end; % break out of loop at end of file

    splitLine = strsplit(tline, ',');  %% separate into columns
    if (length(splitLine) ~= desired_number_of_columns)  %% check for the correct number of columns
        continue;
    end

    features.name(cntr) = str2num(splitLine{1}(2:end)); %% chop off first character and convert to number; does not check for 'L' specifically
    features.bodyposfeat(cntr, 1:desired_number_of_columns-1) = str2double(splitLine(2:end));  %% convert strings to numbers and save the rest of the columns as data
    cntr = cntr + 1;
end

%% optional - delete extra rows in the data structure that were never populated
features.name(cntr:end) = [];
features.bodyposfeat(cntr:end,:) = [];

fclose(fid)
person gariepy    schedule 24.11.2015