2015-11-23 6 views
0

Я пытался прочитать некоторые цифры из форматированного текстового файла. Я хочу сохранить некоторое количество столбцов из многочисленных столбцов, и я хочу повторить его до конца файла (несколько строк или строк).чтение форматированных данных из текстового файла в 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 
+0

Приведите пример первой пары строк вашего файла. –

+0

L0512164529,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,376599, -0,4387758,0,4723490,0,7519389,0,4742642, -0,8703301 ..... L0512164529,0,0001816,0,0000005, -0,0005697, -1,0843741, 0.0001816,0.0000005, -0.0005697, -1.0843741,0.1433973 ..... Это первые две строки текста. Каждая строка начинается с номера со стартом L. – CanCam

+0

Ваши строки имеют переменные столбцы? – excaza

ответ

0

Убедитесь, что вы используете правильное количество %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, он анализирует только одну строку файла.

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

+0

Спасибо за ваш ответ, на самом деле у меня много строк и столбцов в моем текстовом файле. Я скопировал только несколько примеров из них в своем комментарии. Позвольте мне пояснить проблему. У меня есть 1385 строк (строк) и 907 столбцов (без номера L-xxx). Я хочу читать все строки с столбцами только 47 (или некоторым определенным числом), используя textscan. – CanCam

+0

Хорошо, что касается терминологии, если у вас есть переменное количество столбцов (что похоже на то, что вы делаете), то это важно указать в описании проблемы. Textscan не будет работать для вас, если вы хотите пропустить строки, которые не содержат 47 столбцов. Я добавлю еще один ответ с простой альтернативой. – gariepy

0

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

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)