function [Y, X, E,tabE,tabD] = loadRawValues_6(filename) f=fopen(filename,'r'); disp('creating value array...'); i = uint32(0); s = 'Test1_DoppelteAusRohdat_'; s1 = 'Test1_AusRohdatErzeugteSpalten'; s2 = 'Test1_FehlerhafteSensoren'; while ~feof(f) TMP = textscan(f, '%s', 1, 'delimiter', ';'); if ~isempty(TMP{1}) if (strcmp(TMP{1}{1}, 'null')) i = i + 1; %str format 3 cells in a row [NAME, VALUE, DATE] str = textscan(f, '%*s %s %s%*s %s%*s', 1, 'delimiter', ';'); % values E{i,1} = cell2mat(str{1,3}); E{i,2} = cell2mat(strrep(str{1,1},' ','_')); E{i,3} = cell2mat(strrep(E(i,2),':','_')); E{i,4} = upper(E{i,3}); E{i,5} = cell2mat(strrep(str{1,2},'.',',')); end end end fclose(f); disp('searching for double names...'); l = 1; % Zähler für Spaltenwert der Ergebnistabelle q = 0; % Hilfsvariable für Fortführung oder Abbruch der while-Schleife auf Fortführung gesetzt for j = 1 : i - 1 % Zählt bis zur vorletzten Zeile k = j + 1; % Zählt bis zur letzten Zeile q = 0; % Hilfsvariable für Fortführung oder Abbruch der while-Schleife auf Fortführung gesetzt %disp(['progress: num2str(j) of num2str(i)']) % Statusanzeige, kann für bessere Performance auskommentiert werden while q == 0 % wird ausgeführt bis Abbruchkriterium "q" erfüllt ist -> zeitstempel ungleich der überprüften und der folgenden zelle -> eine neue minute if k > i % Abfrage ob zu vergleichende Zeile außerhalb des Arrays disp('end of array reached'); % Statusanzeige, kann für bessere Performance auskommentiert werden break; % Abbruch wenn zu vergleichende Zeile außerhalb des Arrays end if strcmp (E{j,1},E{k,1}) % vergleicht Zeitstempel von zwei Zeilen if strcmp (E{j,4},E{k,4}) % vergleicht Bezeichnung von zwei Zeilen/Sensoren X{l,1} = E{j,1}; % Datum der ersten Zelle X{l,2} = E{j,4}; % Name der ersten Zelle X{l,3} = E{j,5}; % Wert der ersten Zelle X{l,4} = E{k,5}; % Wert der doppelten Zelle X{l,5} = j; % Spaltennummer der ersten Zelle X{l,6} = k; % Spaltennummer der doppelten Zelle X{l,7} = k-j; % Zeilendiffernz zwischen erstem und doppeltem Wert. l = l + 1; %disp('double name found'); % Statusanzeige, kann für bessere Performance auskommentiert werden end k=k+1; if k > i-1 % Abfrage ob zu vergleichende Zeile außerhalb des Arrays disp('end of array reached'); % Statusanzeige, kann für bessere Performance auskommentiert werden break; % Abbruch wenn zu vergleichende Zeile außerhalb des Arrays end elseif strcmp (E{j,1},E{k+1,1}) % vergleicht Zeitstempel mit der auf die ungleiche folgende Zelle um Fehlermeldungen einzelner Sensoren zu ignorieren, bzw. diese auszugeben if strcmp (E{j,4},E{k+1,4}) % vergleicht Bezeichnung von zwei Zeilen/Sensoren X{l,1} = E{j,1}; % Datum der ersten Zelle X{l,2} = E{j,4}; % Name der ersten Zelle X{l,3} = E{j,5}; % Wert der ersten Zelle X{l,4} = E{k+1,5}; % Wert der doppelten Zelle X{l,5} = j; % Spaltennummer der ersten Zelle X{l,6} = k+1; % Spaltennummer der doppelten Zelle X{l,7} = k+1-j; % Zeilendiffernz zwischen erstem und doppeltem Wert. l = l + 1; %disp('double name found'); % Statusanzeige, kann für bessere Performance auskommentiert werden end k=k+2; % einzelner, ungültiger Zeitstempel durch Fehlermeldung wird hiermit ignoriert und innerhalb der Minute weitergesucht %disp('invalid date found'); % Statusanzeige, kann für bessere Performance auskommentiert werden if k > i-2 % Abfrage ob zu vergleichende Zeile außerhalb des Arrays disp('end of array reached'); % Statusanzeige, kann für bessere Performance auskommentiert werden break; % Abbruch wenn zu vergleichende Zeile außerhalb des Arrays end elseif strcmp (E{j,1},E{k+2,1}) % vergleicht Zeitstempel mit der zweiten Zelle nach der ungleichen Zelle um Fehlermeldungen einzelner Sensoren zu ignorieren, bzw. diese auszugeben if strcmp (E{j,4},E{k+2,4}) % vergleicht Bezeichnung von zwei Zeilen/Sensoren X{l,1} = E{j,1}; % Datum der ersten Zelle X{l,2} = E{j,4}; % Name der ersten Zelle X{l,3} = E{j,5}; % Wert der ersten Zelle X{l,4} = E{k+2,5}; % Wert der doppelten Zelle X{l,5} = j; % Spaltennummer der ersten Zelle X{l,6} = k+2; % Spaltennummer der doppelten Zelle X{l,7} = k+2-j; % Zeilendiffernz zwischen erstem und doppeltem Wert. l = l + 1; %disp('double name found'); % Statusanzeige, kann für bessere Performance auskommentiert werden end k=k+3; % einzelner, ungültiger Zeitstempel durch Fehlermeldung wird hiermit ignoriert und innerhalb der Minute weitergesucht %disp('invalid date found'); % Statusanzeige, kann für bessere Performance auskommentiert werden else q=1; % keine Übereinstimmung gefunden, Hilfsvariable für Fortführung oder Abbruch der while-Schleife auf Abbruch gesetzt end end end %Suche nach fehlerhaften Sensoren: disp('searching for invalid timestamps...'); n = 1; for m = 1 : i-1 if ~strcmp (E{m,1},E{m+1,1}) if m == i-1 % Abfrage ob zu vergleichende Zeile außerhalb des Arrays disp('end of array reached'); % Statusanzeige, kann für bessere Performance auskommentiert werden break; end % Abbruch wenn zu vergleichende Zeile außerhalb des Arrays if strcmp (E{m,1},E{m+2,1}) Y{n,1} = E{m+1,1}; % Datum der fehlerhaften Zeile Y{l,2} = E{m+1,4}; % Name der fehlerhaften Zeile Y{l,3} = E{m+1,5}; % Wert der fehlerhaften Zeile Y{l,4} = m+1; % fehlerhafte Zeile n = n + 1; end end end %disp('generating tables...'); % Statusanzeige, kann für bessere Performance auskommentiert werden tabE = cell2table(E); % umformen in Tabellenform tabD = cell2table(X); % umformen in Tabellenform disp('saving file 1...'); % Statusanzeige, kann für bessere Performance auskommentiert werden % Festlegung der Speicherpfades Str = strcat('\\Zub-server-01\Gemeinsame Projekte\12_1205_Wagner_Solar_EnOB_Monitoring\10_Messdaten\MatlabDaten\Wagner\DoppelteSuchen\Ausgabe\',s,'.txt'); writetable(tabD,Str,'Delimiter',';');% Speichern der Datei disp('saving file 2...'); % Statusanzeige, kann für bessere Performance auskommentiert werden % Festlegung der Speicherpfades Str1 = strcat('\\Zub-server-01\Gemeinsame Projekte\12_1205_Wagner_Solar_EnOB_Monitoring\10_Messdaten\MatlabDaten\Wagner\DoppelteSuchen\Ausgabe\',s1,'.txt'); writetable(tabE,Str1,'Delimiter',';');% Speichern der Datei disp('finished...'); % Statusanzeige, kann für bessere Performance auskommentiert werden end