прочитать сложный .txt файл в Matlab - PullRequest
2 голосов
/ 04 июня 2011

Я хотел бы прочитать .txt файл в Matlab.Один из столбцов содержит как буквы, так и цифры.(Так что, я думаю, один из способов - прочитать этот столбец как строку.)

Проблема в том, что мне также нужно найти числа, которые больше 5 в этом столбце.

например, The.TXT выглядит как

12 1
21 2
32 7
11 a
03 b
22 4
13 5
31 6

т.е., в конечном счете, я хотел бы получить

32 7
31 6

Как я могу получить его ??Любые эксперты, пожалуйста, помогите!

Ответы [ 2 ]

4 голосов
/ 04 июня 2011

Вы можете прочитать содержимое файла в массив строк, используя TEXTSCAN , преобразовать строки в числовые значения, используя CELLFUN и STR2NUM (символынапример, 'a' и 'b' приведут к пустой матрице []), удалите строки массива ячеек, в которых есть пустые ячейки, а затем преобразуйте оставшиеся данные в матрицу N-by-2, используя CELL2MAT :

fid = fopen('junk.txt','r');                        %# Open the file
data = textscan(fid,'%s %s','CollectOutput',true);  %# Read the data as strings
fclose(fid);                                        %# Close the file
data = cellfun(@str2num,data{1},'UniformOutput',false);  %# Convert to numbers
data(any(cellfun('isempty',data),2),:) = [];        %# Remove empty cells
data = cell2mat(data);                              %# Convert to N-by-2 array

Матрица data теперь будет выглядеть следующим образом, учитывая ваш пример файла в вопросе:

>> data

data =

    12     1
    21     2
    32     7
    22     4
    13     5
    31     6

И вы можете получить строки, которые имеютзначение больше 5 во втором столбце, например, так:

>> data(data(:,2) > 5,:)

ans =

    32     7
    31     6
0 голосов
/ 04 июня 2011
fid = fopen('txt.txt','r');  

Aout = []; 

while(1)    
    [a1,count1] = fscanf(fid,'%s',1);
    [a2,count2] = fscanf(fid,'%s',1);
    if(count1 < 1 | count2 < 1)
        break;    
    end
    if(~isempty(str2num(a2)) & str2num(a2) > 5 & (~isempty(str2num(a1))) )
        Aout = [ Aout ; str2num(a1) str2num(a2) ];   
    end
end

fclose(fid);

Нарушает невысказанное правило увеличения переменной Matlab во время цикла, но в любом случае это обработка текста, поэтому вы, вероятно, не заметите медлительность.

Редактировать: в предыдущей версии было слишком много ошибокпришлось начинать все заново.

...