Как читать только числовые данные в Matlab и игнорировать любой текст

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

Это мой первый пост, поэтому я не знаком с тем, как размещать здесь свои данные и код, поэтому я приложил немного данных ниже:

0.37364   1.318    0.1090E-02    0.4885E-03    0.236E-02    0.527E-02
0.39237   1.372    0.1214E-02    0.5470E-03    0.211E-02    0.546E-02
0.41129   1.580    0.1612E-02    0.6992E-03    0.142E-02    0.588E-02
 CF SET TO 0.000002 AT X=      0.430 ON SURFACE  1 (1=U/S, 2=L/S)
0.43038   3.070    0.4482E-02    0.1160E-02    0.200E-05    0.905E-02
 HBAR MAX LIMIT REACHED

Поэтому я хочу, чтобы Matlab читал столбцы с числовыми данными и пропускал те, которые содержат текст.

Я ценю вашу помощь и заранее благодарю вас !!!

Хамза


person user3202209    schedule 16.01.2014    source источник
comment
Если сохранить это как файл Excel возможно, комбинированное чтение текста и чисел становится очень простым с xlsread.   -  person Dennis Jaheruddin    schedule 16.01.2014
comment
Если вы хотите продолжить использование textscan, вы имеете в виду, что хотите пропустить строки, содержащие нечисловые данные, или столбцы? Строки с нечисловыми данными кажутся довольно сложными для разделения на столбцы ...   -  person darthbith    schedule 16.01.2014
comment
Могут ли строки с текстом начинаться с чего-то другого, кроме CF или HBAR? Сколько существует различных типов текстовых строк?   -  person horchler    schedule 16.01.2014
comment
Всем привет! Спасибо, что связались со мной! Деннис сохранить его как файл Excel - не вариант. Дартбит: Я хотел пропустить ряды, извини за путаницу. Horchler: Всего существует 3 возможных варианта начала линий.   -  person user3202209    schedule 17.01.2014


Ответы (2)


Решение

result = [];

fid=fopen('data.txt');
while 1
    tline = fgetl(fid);
    if ~ischar(tline), break, end
    celldata = textscan(tline,'%f %f %f %f %f %f');
    matdata = cell2mat(celldata);
    % match fails for text lines, textscan returns empty cells
    result = [result ; matdata];
end

fclose(fid);

Результат

result =
0.3736    1.3180    0.0011    0.0005    0.0024    0.0053
0.3924    1.3720    0.0012    0.0005    0.0021    0.0055
0.4113    1.5800    0.0016    0.0007    0.0014    0.0059
0.4304    3.0700    0.0045    0.0012    0.0000    0.0091

data.txt

0.37364   1.318    0.1090E-02    0.4885E-03    0.236E-02    0.527E-02
0.39237   1.372    0.1214E-02    0.5470E-03    0.211E-02    0.546E-02
0.41129   1.580    0.1612E-02    0.6992E-03    0.142E-02    0.588E-02
 CF SET TO 0.000002 AT X=      0.430 ON SURFACE  1 (1=U/S, 2=L/S)
0.43038   3.070    0.4482E-02    0.1160E-02    0.200E-05    0.905E-02
 HBAR MAX LIMIT REACHED
person Tobold    schedule 16.01.2014
comment
Спасибо, Тобольд, у меня не было возможности опробовать ваш метод, поскольку я придумал другой способ, но большое спасибо за публикацию этого ответа! - person user3202209; 17.01.2014

Я придумал следующий обходной путь:

    m=1;
    for k=1:10;    % create for loop ranging from start to finish of data
        ful = sscanf(S{k,1},'%f');  % scan each line for a floating point number
        le=size(ful);               % gives size of the scanned values

        if le(1) > 0                % Only read if there is a value of > 0 ( for non-floating i.e. string, the value = 0)
            for t=1:le(1)
                data1(m,t)=ful(t);  % store the value in matrix
            end
            m=m+1;
        end
    end

Кажется, это помогает!

person user3202209    schedule 17.01.2014