Verfasst am: 05.04.2017, 14:46
Titel: Einlesen csv mit vorherigem Ersetzen
Guten Tag,
ich stehe zur Zeit vor folgendem Problem und hoffe jemand kann mir ein wenig auf die Sprünge helfen.
Gegeben sind für mich Messdaten in mehreren csv-Dateien. Das Einlesen als Table mit ' ' und ';' als Leerzeichen klappt schon gut und ich erhalte meine erwünschte Matrix.
Aufbau der Daten:
111 DatumTag1 X Y ...
222 DatumTag1 X Y ...
333a DatumTag1 X Y ...
333 b DatumTag1 X Y ...
333/03 DatumTag1 X Y ...
111 DatumTag2 X Y ...
222 DatumTag2 X Y ...
333a DatumTag2 X Y ...
333 b DatumTag2 X Y ...
333/03 DatumTag2 X Y ...
...
Die Datenreihen '333 b' und '333/03' bereiten mir Probleme, da bei dem ersteren 'b' aufgrund des Doppelleerzeichens in die zweite Reihe aka Datumreihe geschrieben wird und alle folgenden Einträge in der Zeile um eins nach rechts verschoben werden. Bei der anderen Datenreihe wird '333/03', wahrscheinlich aufgrund des '/', als NaN ausgeschrieben.
Nun möchte ich vor meiner eigentlichen csv-Importierung beispielsweise '333 b' durch '333b' und '333/03' durch '33303' ersetzen, damit es anschließend keine Probleme gibt. Die eigentlich Importierung funktioniert so wie sie soll und ich habe sie mir als Funktion ausgeben lassen.
Nur wo und wie am Anfang kann ich die Funktion nach meinem Wunsch erweitern? Hier ein Auszug von den ersten Funktionsschritten:
Code:
function AB = importfile(filename, startRow, endRow)
%IMPORTFILE Import numeric data from a text file as a matrix.
% AB = IMPORTFILE(FILENAME) Reads data from text file FILENAME for the % default selection.
%
% AB = IMPORTFILE(FILENAME, STARTROW, ENDROW) Reads data from rows % STARTROW through ENDROW of text file FILENAME.
%
% Example: % AB = importfile('AB.csv', 1, 2321);
%
% See also TEXTSCAN.
% Auto-generated by MATLAB on 2017/04/05 14:41:22
%% Initialize variables.
delimiter = {' ',';'};
if nargin<=2
startRow = 1;
endRow = inf;
end
%% Read columns of data as text: % For more information, see the TEXTSCAN documentation.
formatSpec = '%s%s%s%s%s%s%s%s%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 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, '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, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for col=1:length(dataArray)
dataArray{col} = [dataArray{col};dataArrayBlock{col}];
end end
Ich tendiere dazu es noch vor initialize variables einzubauen, doch bin mir nicht sicher wie.
Habe bereits etwas mit diesem hier probiert, doch es gibt eine Fehlermeldung bei 'fprintf(fout,'%s',s)'
(zugegeben diesen Abschnitt habe ich mir aus dem Forum kopiert und etwas an den offensichtlichen Stellen angepasst, was genau feof,fgetl,strrep durchführen, ist mir nicht ganz klar. Das Ergebnis ist am wichtigsten)
Code:
fin = fopen(filename);
fout = fopen('output.csv');
heute hat es dann geklappt. Habe unter anderem das Problem, dass in die output.csv keine Absätze eingebaut wurden. Durch einfügen von \n konnte das behoben werden. Der Übersichts halber habe ich zudem strrep durch replace ersetzt. Disp war auch überflüssig.
Edith: Das 'w' muss zusätzlich noch bei fopen eingesetzt werden wie Harald richtig angemerkt hat, da die Funktion ansonsten nur funktioniert, wenn die Output-Datei bereits angelegt ist.
So funktioniert es nun:
Code:
fin = fopen(filename);
fout = fopen('output.csv','w');
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.