чтение текстового файла в MATLAB с различным форматированием - PullRequest
0 голосов
/ 11 февраля 2010

У меня есть текстовый файл, но, к сожалению, он плохо отформатирован, однако я хочу прочитать содержимое текстового файла в матрицу, но я не знаю, как это сделать.

Когда вы пытаетесь использовать fscanf, textscan, textread, а все остальное просто копирует все в одну ячейку, но я не хочу, чтобы это было так.

Вот так выглядит контент: поэтому я хочу читать только десятичные, а не абсолютные цифры. Может ли кто-нибудь помочь мне.

 1 : 13.27 ;  3 : 20.68 ;  6 : 8.271 ;  7 : 3.308 ;  8 : 8.328 ; 
 9 : 6.655 ;  10 : 16.58 ;  11 : 9.925 ;  12 : 12.41 ;  13 : 4.135 ; 
 14 : 9.925 ;  15 : 11.58 ;  16 : 10.87 ;  17 : 1.654 ;  18 : 4.962 ; 
 19 : 6.655 ;  22 : 10.98 ;  23 : 24.25 ;  24 : 47.33 ;  25 : 11.6 ; 
 26 : 9.925 ;  27 : 5.809 ;  28 : 5.001 ;  29 : 6.617 ;  30 : 7.577 ; 
 31 : 9.155 ;  32 : 7.444 ;  33 : 28.58 ;  34 : 9.155 ;  35 : 35.83 ; 

Ответы [ 3 ]

4 голосов
/ 11 февраля 2010

Простое использование текстового сканирования и игнорирование того, что вам не нужно, например чисел и: дает вам довольно простое решение:

fid = fopen('test.txt', 'rt');
data = textscan(fid, '%*u %*1s %f', 'Delimiter', ';');
fclose(fid);

Измените test.txt на ваше имя файла. данные - это ячейка с вашими двойниками.

>> data{:}

ans =

   13.2700
   20.6800
    8.2710
    3.3080
    8.3280
    6.6550
   16.5800
    9.9250
   12.4100
    4.1350
    9.9250
   11.5800
   10.8700
    1.6540
    4.9620
    6.6550
   10.9800
   24.2500
   47.3300
   11.6000
    9.9250
    5.8090
    5.0010
    6.6170
    7.5770
    9.1550
    7.4440
   28.5800
    9.1550
   35.8300
2 голосов
/ 11 февраля 2010

Я предполагаю, что двоеточие (:) разделяет значения в строке, а точка с запятой (;) разделяет строки. С этим допущением следующая функция должна считывать ваши данные в матрицу MATLAB

function dat = readData(filename)
% FUNCTION dat = readData(filename)
% Reads data from a nonstandard formatted file, filename
% INPUTS:
%    filename:  Full path to data file with the following format
%                      1 : 2; 3 : 4
%               where the : separates values in a row and ; separates rows

% open the file for reading
fid = fopen(filename);

ii=0; % row index

while ~feof(fid) % loop until we find the end of the file
    str = fgetl(fid); % get a line of text

    while 1
        % split the string into its component parts
        % assume that values are split with colon ":" and
        % rows are identified with a
        % semicolon ";".
        % 
        % split at the first row using strtok
        [rowStr rem]=strtok(str,';');

        % split rowStr using colon
        [str1,str2]=strtok(rowStr,':');

        % get rid of the colon in str2
        str2 = strrep(str2,':',' ');

        str1 =strtrim(str1);
        str2 =strtrim(str2);

        % store data if we found any
        if ~isempty(str1)&& ~ isempty(str2)
            ii=ii+1; % increment row index
            dat(ii,:) = [str2double(str1) str2double(str2)];
        end

        if isempty(rem), break; end
        str = rem(2:end);
    end
end
fclose(fid);

Вы можете использовать функции round, floor, ceil для извлечения «десятичных значений».

1 голос
/ 11 февраля 2010

концептуально:

возьми строку.

Изменение: и; с пробелами и \ n (возврат) с;

Присвойте строку переменной, переменная должна стать матрицей.

С двойной петлей измените значение каждого элемента с помощью

var(i,j)=floor(var(i,j)) - var(i,j);

Вот, пожалуйста (если я вас не правильно понял).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...