WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Einlesen csv mit vorherigem Ersetzen

 

Thob96
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 05.04.2017, 14:46     Titel: Einlesen csv mit vorherigem Ersetzen
  Antworten mit Zitat      
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

%% Close the text file.
fclose(fileID);
...
 


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');

 while ~feof(fin)
    s = fgetl(fin);
    s = strrep(s, '333  b', '333b');
    fprintf(fout,'%s',s);
    disp(s)
 end

 fclose(fin)
 fclose(fout)

filename='output.csv';
 


Vielen Dank für Eure Hilfe,

Grüße,
Thob
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.04.2017, 16:18     Titel:
  Antworten mit Zitat      
Hallo,

bitte immer angeben, welche Fehlermeldung du bekommst.

Vermutung: du musst die Datei zum Schreibzugriff öffnen:
Code:
fout = fopen('output.csv', 'w');


Auch dürfte so alles in eine Zeile geklatscht werden. Da hilft ggf. \n.
Für mehr Infos zu den einzelnen Befehlen solltest du die jeweilige Doku lesen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 05.04.2017, 16:28     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Werde morgen wieder daran weiterarbeiten können und schaue mir die Funktionen genauer an.

Dann bin ich ja nicht auf dem kompletten Holzweg.

Grüße,
Thob
Private Nachricht senden Benutzer-Profile anzeigen
 
Thob96
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 05.04.17
Wohnort: ---
Version: 2016b
     Beitrag Verfasst am: 06.04.2017, 10:00     Titel:
  Antworten mit Zitat      
Moin,

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');

 while ~feof(fin)
    s = fgetl(fin);
    s = replace(s, '333  b', '333b');
    fprintf(fout,'%s\n',s);
 end

 fclose(fin)
 fclose(fout)

filename='output.csv';
 


Danke für die Hilfe, habe wieder was gelernt.

Grüße,
Thob
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.