Получать данные из текстовых файлов в MATLAB - PullRequest
1 голос
/ 27 августа 2010

У меня большая проблема, чтобы получить блок данных, структурированный особым образом.Вот как должны быть получены данные (это txt):

V|0|0|0|t|0|1|1|4|11|T4|H13||||||||||||
P|40|0.01|10|1|1|0|40|1|1|1||1|*||0|0|0
*|A1|A1|A7|A16|F|F|F|F|F|F|||||||||||||
*|codserv|area|codice|nome|tnom|tmin|tmax|pc|qc|susc|||||||
*|||||kV|kV|kV|MW|MVAR|S||||||||||||
N|I|1|N01|N01|132|125.4|138.6|0|0||||||||
N|I|1|N02|N02|20|19|21|0|0|||||||||||||
N|I|1|N03|N03|20|19|21|1.013532234|0.49087611||||||||
N|I|1|N04|N04|20|19|21|0.390791617|0.189269056||||||||
N|I|1|N05|N05|20|19|21|0.180634542|0.121387171||||||||
N|I|1|N06|N06|20|19|21|0.709472564|0.343613323||||||||
N|I|1|N07|N07|20|19|21|0.103495727|0.069549543||||||||
N|I|1|N08|N08|20|19|21|0.351712456|0.170342158||||||||
N|I|1|N09|N09|20|19|21|0.097697904|0.06565339||||||||
N|I|1|N10|N10|20|19|21|0.162165157|0.078540184||||||||

Алгоритм должен:

  • пропустить первые 3 строки

  • пропустить пятую строку

  • Четвертая строка

    *|codserv|area|codice|nome|tnom|tmin|tmax|pc|qc|susc|||||||
    

    сохранить каждую строку в векторе пустым

    codeserv=[]
    area=[]
    codice=[]
    nome=[]
    tnom=[]
    tmin=[]
    tmax=[]
    pc=[]
    qc=[]
    susc=[]
    
  • Заполнить векторы данными и строками в строках, следующих за четвертым

    codeserv=[N N N N N N N N N N ....]
    area=[I I I I I I I ....]
    codice=[1 1 1 1 1 1 ...]
    nome=[N01 N02 N03 N04 N05 ]
    tnom=[N01 N02 N03 N04 N05]
    tmin=[132 20 20.....]
    tmax=[125.4 19 19 19 ....]
    pc=[138.6 21 21 21....]
    qc=[0 0 1.013532234 ....]
    susc=[0 0 0.49087611]
    

Ответы [ 2 ]

2 голосов
/ 27 августа 2010

взгляните на textscan

У вас есть какой-либо контроль над форматом текстового файла?

EDIT

вот довольно хакерский способ достижения результата

function readtest()

fid = fopen('test.txt'); 

%skip 3 lines, save 4th, skip 5th
for i = 1:4
    names = fgetl(fid);
end
fgetl(fid);

% separate out names
names = textscan(names,'%s','delimiter','|');

% read the data
data = textscan(fid,'%s %s %d %s %s %d %d %f %f %f %[| ]','delimiter','|');

fclose(fid);




for i = 1:size(data,2)-1
    values = ( data{i}(1:end));
    if(iscell(values))
        values = cell2mat(values);
    end

    name = names{1}{i+1};

    % very basic error checking
    if(~strcmp(name, ''))

        %save the value in the calling work space
        assignin('caller', name, values)
    end
end
0 голосов
/ 27 августа 2010

Есть ли причина для Matlab?Если вы учитесь в академических кругах, у вас может быть доступ к LabVIEW, который может быть легче освоить для чего-то подобного.Вы захотите использовать VI чтения из текстового файла, а затем проанализировать строку.Конечно, вам придется использовать «|»символы для разделения данных (используйте шаблон сопоставления VI).Возможно, вы захотите реструктурировать способ хранения данных в текстовом файле - используйте текстовые ключи вместо |.Что-то вроде:

codserv N area | codice 1 nome N01 tnom 20 и т.д ...

Извините, что не предоставил ответ с каким-либо источником Matlab, но я бы рассмотрел LabVIEW, если это вариант.

...