Hallo zusammen ich möchte meine Ergebnisse nach der Simulation einer bestehenden Datei (xlsx) hinzufügen.
Meine Matrix ist eine 3xn
Code:
fid=fopen('Ergebnisse.xlsx', 'a+')% springt an die letzte Stelle , am liebsten hätte ich sogar noch eine Zeile frei damit man es besser auseinanderhalten kann fprintf(fid,'%f,%f,%f,%f\n');
fclose(fid)
willst du jetzt eine Textdatei haben (fopen/fprintf deutet darauf hin) oder eine Excel-Datei?
Bei einer Excel-Datei ist das Problem, dass es recht mühsam ist, den verwendeten Bereich zu bestimmen. Da ist es einfacher (wenn auch recht ineffizient), die Datei zu laden, die neuen Daten anzuhängen, und die Datei dann zu überschreiben.
Hallo Harald,
also ich hab eine eine Datei für einen Zeitraum 01.-03.02.2017 ( das ist die alte datei die eingelesen werden soll)
Zeit v b x d s k d
01.02.2017 0,86 0,27 0,25 0,17 0,96 0,27 0,56
02.02.2017 0,70 0,77 0,44 0,11 0,88 0,99 0,10
03.02.2017 0,89 0,56 0,45 0,66 0,22 0,33 0,40
dann eine Datei aktuelle datei die zur alten hinzugefügt werden soll.
Zeit v b x d s k d
04.02.2017 0,86 0,27 0,25 0,17 0,96 0,27 0,56
05.02.2017 0,70 0,77 0,44 0,11 0,88 0,99 0,10
06.02.2017 0,89 0,56 0,45 0,66 0,22 0,33 0,40
diese beiden sollen eine Datei werden:
Zeit v b x d s k d
01.02.2017 0,86 0,27 0,25 0,17 0,96 0,27 0,56
02.02.2017 0,70 0,77 0,44 0,11 0,88 0,99 0,10
03.02.2017 0,89 0,56 0,45 0,66 0,22 0,33 0,40 ,
04.02.2017 0,86 0,27 0,25 0,17 0,96 0,27 0,56
05.02.2017 0,70 0,77 0,44 0,11 0,88 0,99 0,10
06.02.2017 0,89 0,56 0,45 0,66 0,22 0,33 0,40
Bis dato ist es eine csv datei. Wenn eine text.datei einfacher ist einen code zu erstellen kann ich die datei zuvor evtl umwandeln.
Grüße
Hallo Harald,
es wird kein Fehler angezeigt, es wird aber auch nichts hinzugefügt.
Code:
fid=fopen('Ursprungsdatei.xlsx', 'a+')% springt an die letzte Stelle , am liebsten hätte ich sogar noch eine Zeile frei damit man es besser auseinanderhalten kann fprintf(fid,'%f,%f,%f,%f\n'); %überschreibt Datei mit neuen Dateien oder ?
fclose(fid)
mir ist durchaus klar, was du brauchst. Ich habe dir einen Denkanstoß zu deinem Codeausschnitt gegeben. Es ist klar, dass der Code nichts in die Datei schreibt, weil du nicht angibst, was in die Datei geschrieben werden soll. Mit Hilfe der Doku sollte es dir möglich sein, zumindest dieses Problem selbst zu beheben.
fid=fopen('Ursprungsdatei.xlsx', 'a+')% springt an die letzte Stelle , am liebsten hätte ich sogar noch eine Zeile frei damit man es besser auseinanderhalten kann fprintf(fid,'%f,%f,%f,%f\n', neuematrix); %passt das so?
fclose(fid)
Hallo Harald,
ich habe diese Funktion und möchte die unten angesprochenen Sachen umsetzen.
Zunächst habe ich die Datei(CSV) eingelesen Funktionsskript.
Datei Einlesen:
Code:
function Feld = importfile(filename, startRow, endRow)
% Example: % Felddaten = importfile('Feld1.csv');
%% Initialize variables.
delimiter = ',';
if nargin<=2
startRow = 2;
endRow = inf;
end
%% Read columns of data as strings:
formatSpec = '%*s%s%s%*s%*s%*s%s%s%*s%*s%s%[^\n\r]';
%% Open the text file.
fileID = fopen(filename,'r');
%% Read columns of data according to format string.
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false);
for block=2:length(startRow) frewind(fileID);
dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false);
for col=1:length(dataArray)
dataArray{col} = [dataArray{col};dataArrayBlock{col}];
end end
%% Convert the contents of columns containing numeric strings to numbers. % Replace non-numeric strings with NaN.
raw = repmat({''},length(dataArray{1}),length(dataArray)-1);
for col=1:length(dataArray)-1
raw(1:length(dataArray{col}),col) = dataArray{col};
end
numericData = NaN(size(dataArray{1},1),size(dataArray,2));
for col=[1,2,3,4,5] % Converts strings in the input cell array to numbers. Replaced non-numeric % strings with NaN.
rawData = dataArray{col};
for row=1:size(rawData, 1);
% Create a regular expression to detect and remove non-numeric prefixes and % suffixes.
regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)';
try
result = regexp(rawData{row}, regexstr, 'names');
numbers = result.numbers;
% Detected commas in non-thousand locations.
invalidThousandsSeparator = false;
ifany(numbers==',');
thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$';
ifisempty(regexp(thousandsRegExp, ',', 'once'));
numbers = NaN;
invalidThousandsSeparator = true;
end end % Convert numeric strings to numbers. if ~invalidThousandsSeparator;
numbers = textscan(strrep(numbers, ',', ''), '%f');
numericData(row, col) = numbers{1};
raw{row, col} = numbers{1};
end catch me
end end end
%% Replace non-numeric cells with NaN
R = cellfun(@(x) ~isnumeric(x) && ~islogical(x),raw); % Find non-numeric cells
raw(R) = {NaN}; % Replace non-numeric cells
Nun möchte ich folgendes :
Überprüfen ob die folgende Datei Feld.csv im Pfad = 'C:\Users\\Desktop\Feld\ existiert ,wenn ja dann öffne Sie
wenn nicht dann dann speichere die eingelesene Datei in diesem Pfad
wenn die Datei existiert , überprüfe ob Werte doppelt vorkommen
übernehme nur neue Zahlen und füge sie unten zur alten Datei hinzu
Datei speichern
Code:
if exist('C:\Users\\Desktop\Daten\Felddatei1.csv', 'file') load(Felddatei1.csv)
fid=fopen('Felddatei1.csv', 'a+')
Index = find(Feld(:,1) == Felddatei1(:,1));
fprintf(fid,'%f,%f,%f,%f,%f\n', Feld);
fclose(fid) else
filename = 'Felddatei1.csv';
F = Feld;
csvwrite(filename,F) end
bitte überlege dir genau, welche Unterstützung du willst. Die jetzige Frage hat mit der vorherigen wenig zu tun.
Zitat:
problem ist das jetzt eine 7110x1 matrix habe
Was ist eine 7110x1 matrix und woher kommt das her?
Zitat:
und die Werte innerhalb der Zelle mit Kommas getrennt sind.
Matrix bedeutet numerisch, und bei einem numerischen Array ist das nicht möglich. Welchen Datentyp hat diese 7110x1-Array also?
Zitat:
eventuell liegt es an der gespeicherten Datei da in Jeder Zelle 5 Werte durch Kommas getrennt sind?
Das sollte kein Problem sein. Bitte stelle ein konkretes Beispiel einer Datei, die genau verwendeten Befehle und die Probleme, die dabei aufgetreten sind, zur Verfügung.
Warum der neue Ansatz? Warum hängst du die Daten nicht so an, wie du es vor hattest?
also insgesamt bezieht sich die erste Frage mit den Anhängen von Dateien auf eine automatische Generierung eines Datenpools. Ich bekomme in regelmäßigen Zeitabständen Daten mit Zeitstempeln gestellt. Dabei soll der neu eingelesene Datensatz mit dem alten verglichen werden. Dabei sollen Überschneidungen vom Zeitstempel der Datensätze vermieden werden.
Datensatz 1: 6.00-12.00 Uhr 14.06.2018
Datensatz 2: 10.00-18.00 Uhr 14.06.2018 ( Es kommt zu Überschneidungen des Zeitstempels und somit zu Doppeleinträgen)
=>Diese beiden Datensätze sollen zusammengefügt werden
und dann einen Datensatz mit 6.00-18.00 Uhr 14.06.2018 bilden.
Da ich leider keine cvs.datei hochladen kann, habe ich diese als txt hochgeladen. Es handelt sich hierbei um ein Ausschnitt der Datei. Der folgende Code bezieht sich aber auf den Ausschnitt.
Ziel dieses Themas/ Aufbau:
1) Die Datei zum aktuellen Datensatz einzulesen (siehe Code)
2) Überprüfung:
2.1) zunächst schauen ob schon eine zuvor gespeicherte Datei im Format csv. vorhanden ist/existiert (von einem älteren Datensatz)
- wenn ja,
dann soll die Datei in Matlab eingelesen werden und mit der Datei des aktuellen Datensatzes auf dem Zeitstempel verglichen werden. Es kann zu Überschneidungen der Zeit kommen. Daher die Überprüfung. Wenn es dazu kommt sollen die Zeilen des neuen Datensatz nicht mit berücksichtigt werden.
2.2) die übrigen Daten die keine Überschneidung aufweisen( vom neuen Datensatz) sollen an den alten Datensatz angefügt werden und gespeichert werden.
- wenn nicht,
dann soll die aktuelle Datei als csv Format in Pfad: XY gespeichert werden. ( Dieser Fall tritt nur ein wenn man ganz am Anfang von der Generierung eines Datenpools anfängt. Danach besteht ja immer eine ältere Datei wo die neuen Datensätze angefügt werden sollen.
function Fensterneu = importfile(filename, startRow, endRow)
%IMPORTFILE Import numeric data from a text file as a matrix.
% Example: % Fensterneu = importfile('Fenster.csv');
%% Initialize variables.
delimiter = ',';
if nargin<=2
startRow = 2;
endRow = inf;
end
%% Format for each line of text: % column1: double (%f) % column2: double (%f) % column3: double (%f) % column4: double (%f) % column5: double (%f) % For more information, see the TEXTSCAN documentation.
formatSpec = '%f%f%f%f%f%[^\n\r]';
%% Open the text file.
fileID = fopen(filename,'r');
%% Read columns of data according to the format. % This call is based on the structure of the file used to generate this % code. If an error occurs for a different file, try regenerating the code % from the Import Tool.
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'TextType', 'string', 'HeaderLines', startRow(1)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for block=2:length(startRow) frewind(fileID);
dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'TextType', 'string', 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for col=1:length(dataArray)
dataArray{col} = [dataArray{col};dataArrayBlock{col}];
end end
%% Post processing for unimportable data. % No unimportable data rules were applied during the import, so no post % processing code is included. To generate code which works for % unimportable data, select unimportable cells in a file and regenerate the % script.
ifexist('C:\Users\Documents\MATLAB\Fenster.csv', 'file')
A = load(Fenster.csv) %alte Datei einlesen
Index = find(A(:,1) == Fensterneu(:,1)); %vergleich ob beide Dateien Überschneidungen haben 0 nein , 1 = ja
fid=fopen('Fenster.csv', 'a+')% an die letzte Zeile von Fenster springen fprintf(fid,'%f,%f,%f,%f,%f\n', Fensterneu); %Fenster(neuer Datensatz hinzufügen
fclose(fid)
filename = 'Fenster.csv'; %speicherung
F = Fenster;
csvwrite(filename,F)
else
%% File does not exist. % warningMessage = sprintf('Warning: file does not exist:\n%s', fullFileName); % uiwait(msgbox(warningMessage)); % end
filename = 'Fenster.csv';
F = Fenster;
csvwrite(filename,F) end
Da ich leider keine cvs.datei hochladen kann, habe ich diese als txt hochgeladen.
Natürlich kannst du: zippen. Dann kann man sicher sein, dass die Datei auch das Format hat, dass sie wirklich hat.
Schau dir doch die Fehlermeldung mal ganz scharf an. Woran könnte das wohl liegen?
Anders gefragt: an anderer Stelle setzt du den Dateinamen in ' ', warum nicht auch hier?
%% Initialize variables.
delimiter = ',';
if nargin<=2
startRow = 2;
endRow = inf;
end
%% Format string for each line of text: % column1: double (%f) % column2: double (%f) % column3: double (%f) % column4: double (%f) % column5: double (%f) % For more information, see the TEXTSCAN documentation.
formatSpec = '%f%f%f%f%f%[^\n\r]';
%% Open the text file.
fileID = fopen(filename,'r');
%% Read columns of data according to format string. % This call is based on the structure of the file used to generate this % code. If an error occurs for a different file, try regenerating the code % from the Import Tool.
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false);
for block=2:length(startRow) frewind(fileID);
dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false);
for col=1:length(dataArray)
dataArray{col} = [dataArray{col};dataArrayBlock{col}];
end end
%% Post processing for unimportable data. % No unimportable data rules were applied during the import, so no post % processing code is included. To generate code which works for % unimportable data, select unimportable cells in a file and regenerate the % script.
ifexist('C:\Users\\Desktop\Daten\Fenster.csv', 'file')
A = fopen('Fenster.csv'); %alte Datei einlesen
% Index = find(A(:,1) == Fenster(:,1)); ,vergleich ob beide Dateien Überschneidungen haben 0 nein , 1 = ja % fid=fopen('Fenster.csv', 'a+') an die letzte Zeile von Fenster springen % fprintf(fid,'%f,%f,%f,%f,%f\n', Fenster); Fenster(neuer Datensatz hinzufügen % fclose(fid) % filename = 'Fenster.csv'; ,speicherung % F = Fenster; % csvwrite(filename,F) % else % File does not exist. % warningMessage = sprintf('Warning: file does not exist:\n%s', fullFileName); % uiwait(msgbox(warningMessage)); % end % cd('C:\Users\Desktop\Daten\') % filename = 'Fenster.csv'; % F = Fenster; % csvwrite(filename,F) % cd('C:\Users\Desktop\Daten\') end
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.