2015-11-16 3 views
1

Я пытаюсь внести некоторые изменения в список данных о осадках. данные находятся в файле *.txt в этом формате:Создайте текстовый файл с помощью Matlab

50810,200301010600,0.0 
50810,200301010601,0.0 
50810,200301010800,0.0 
50810,200301010938,0.1 
50810,200301010947,0.1 
50810,200301010957,0.1 

Каждый файл у меня есть содержит данные об осадках в минуту от 1 года. Первое число - это номер станции, и это равно для каждой строки в файле. В моем исходном файле у меня есть одна строка с данными за каждую минуту.

Я хочу, чтобы создать новый файл, который содержит:

  • Только линии с осадками, которые не равны нулю, поэтому я хочу, чтобы удалить все строки, где последнее число равно нулю. Я понял это.
  • Если есть целый час без осадков, я хочу удалить все нулевые линии и создать новую строку, которая гласит: 50810,200301010600,0.0. Если осадков не было между 6 и 7 утра. на 01.01.

    clear all 
    
    data = load('jan-31des_2003.txt'); %opens file with data 
    fid=fopen('50810_2003','w'); %opens empty file to write 
    [nrow, ncol] = size(data); %size of data 
    fprintf(fid,'%5s %12s %5s \r\n','Snr','Dato - Tid','RR_01') %Header 
    
    for row = 1:nrow 
    
        y = data(row,2); %year 
        m = data(row,3); % month 
        d = data(row,4); % date 
        h = data(row,5); % hour 
        M = data(row,6); % minute 
        p = data(row,8); % precipitation 
    
        if p > 0 
        fprintf(fid,'50810,%04d%02d%02d%02d%02d,%.1f \r\n',[y,m,d,h,M,p]); 
        end 
        if p==0 
         HERE I NEED SOME HELP 
        end 
    
    end 
    
    fclose(fid); 
    

Что такое код для моего желаемого форматирования в состоянии if p==0?

+0

Возможный дубликат [Поиск островов нулей в последовательности] (http://stackoverflow.com/questions/3274043/finding-islands-of-zeros-in-a-sequence) – excaza

ответ

0

Предполагая, что вы уже импортировали свои данные в виде массива M * 3 с именем infile, а M делится на 60, а ваши данные начинаются с первой минуты часа, и у вас есть массив outfile, который будет записан в новый файл:

outfile = [] 
while ~isempty(infile) 
    block = infile(1:60,:);   % Take one hour's worth of data 
    if sum (block(:,3)==0) == 60  % Check if the last column are all zero 
     outfile = cat(1, outfile, [block(1,1:2), 0]); % If so, put one line to new array 
    else 
     filter = block(:,3)~=0;  % Otherwise, pick out only rows that the last column is not zeros 
     outfile = cat(1, outfile, block(filter,:)); % Put these rows into the new array 
    end 
    infile(1:60,:) = [];    % Remove already processed data from original array 
end 

Затем написать весь outfile массив в файл.

+0

Это работает. Спасибо! – user3328362

+0

Пожалуйста, нажмите на знак v слева и примите ответ, чтобы люди были рады помочь вам решить вашу проблему. Спасибо :) – user3667217

+0

Мне также нужна помощь С другим случаем. В некоторых моих данных в исходный набор данных включены только времена с осадками больше нуля. Таким образом, метод выше, проверяя все значения по часам, не будет работать. У кого-нибудь есть идея, как это сделать? – user3328362