Получите данные из текстовых файлов в MATLAB

У меня есть большая проблема с получением блока данных, структурированных определенным образом. Вот как данные должны быть получены (это 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]
    

person Marietto85    schedule 27.08.2010    source источник


Ответы (2)


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

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

РЕДАКТИРОВАТЬ

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

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
person second    schedule 27.08.2010
comment
Я согласен ... может потребоваться реструктуризация формата, если вы остаетесь в Matlab. - person gary; 27.08.2010
comment
Я думаю, что может потребоваться реструктуризация формата, чтобы упростить задачу на любом языке — даже с LabVIEW. - person Jonas; 27.08.2010
comment
Я благодарю вас за помощь, я пробую решение, которое вы сделали. ты действительно великий программист второй!!! - person Marietto85; 28.08.2010
comment
К сожалению, у меня нет контроля над файлом, потому что это текстовый формат, но созданный программой C, а программа является исполняемым файлом (.exe) - person Marietto85; 28.08.2010
comment
во-вторых, моя почта: [email protected] .email или msn, мы можем поговорить, проблема у меня небольшая, но ее трудно объяснить. - person Marietto85; 29.08.2010

Любая причина для Matlab? Если вы работаете в академических кругах, у вас может быть доступ к LabVIEW, который может быть легче изучить для чего-то подобного. Вы захотите использовать ВП Read from Text File, а затем проанализировать строку. Конечно, вам придется использовать "|" символов для разделения данных (используйте Match Pattern VI). Со временем вы, возможно, захотите реструктурировать и способ хранения данных в текстовом файле — используйте текстовые клавиши, а не |. Что-то типа:

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

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

person gary    schedule 27.08.2010
comment
Это часть проекта, где им обязательно придется использовать Matlab. На самом деле данные будут получены с помощью алгоритма в MATLAB. Я бы также предпочел использовать Labview, но не могу. - person Marietto85; 27.08.2010
comment
Хорошо, вы можете заменить | на табуляцию (или запятую). Затем откройте текстовый файл как матрицу с разделителями табуляции (или CSV, если вы используете запятые). Удачи. - person gary; 27.08.2010