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

Berechnete Daten aus Matlab in .csv Datei schreiben

 

davido1991
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 21.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 13:06     Titel: Berechnete Daten aus Matlab in .csv Datei schreiben
  Antworten mit Zitat      
Hallo Forum.

Ich habe ein konkretes Problem. Ich bin mir ziemlich Sicher das man das mit Matlab lösen kann, es stellt mich als Neuling aktuell aber vor eine große Herausforderung.

Folgende Ausgangslage: Ich habe Daten berechnet. In diesem Beispiel liegen diese in einer Variable mit der Form 3x6double (zukünftig aber gerne in nx6double).

Ziel: Die Daten automatisch mit einer bestimmten Syntax in eine csv Tabelle speichern.

Beschreibung:
Aktuell liegt meine Variable mit dem Namen "a1test" in folgender Form vor:


Mein Ziel ist es jetzt, diese Daten in folgendes .csv Muster zu kopieren:


Dabei möchte ich die Daten nur in die Gelb markierten Zellen schreiben, der Rest soll immer gleich bleiben. Und zwar soll nun der erste Zeilenvektor der Datenvariable in der .csv Datei als Spaltenvektor eingetragen werden. Erschwerend kommt hinzu, das der erste Wert in der csv Datei in die "H-Spalte", der zweite bis vierte in die "G-Spalte", der fünfte in die "H-Spalte" und der letzte und sechste wieder in die "G-Spalte" kommt.
Weitere Problemstellungen die ich sehe, aber nicht umzusetzen weiß:
- In der csv-Datei befindet sich der Datentyp string und double
- Das Dezimaltrennzeichen soll der Punkt sein
- Falls meine Datenvariable mal länger ist, würde ich dies am liebsten mit einer Variable n (also Datentyp nx6) anpassen können.

Wenn mir das jemand helfen könnte komm ich persönlich vorbei undund gebe ihm ein Kaltgetränk aus Very Happy. So viel Zeit sollte ich tatsächlich dabei gewinnen, dass nicht immer händisch auszufüllen.

Nur um zu zeigen, dass ich mir auch schon ein paar (nicht gut funktionierende) Gedanken gemacht habe, aber für jemanden der es richtig beherrscht wahrscheinlich nutzlos sind:

Code:
%Matrix runden
anssave=round((a1test)'*100)/100

%Schleife zum abspeichern der Informationen
for i=1:3
    %conversions
    anssave(:,i) = [anssave(:,i)]
end

%Speichern in csv
dlmwrite('pos.csv', anssave2,'delimiter','\t')


Vielen Dank für jede Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2017, 13:22     Titel:
  Antworten mit Zitat      
Hallo,

am einfachsten dürfte es sein, wenn du die komplette Datei (außer 1. Zeile) als Table einliest ( readtable ), in MATLAB die Änderungen vornimmst, und dann wieder als Table rausschreibst ( writetable ).

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 21.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 13:28     Titel:
  Antworten mit Zitat      
Vielen Dank schonmal!

Das klingt schon mal ganz gut. Könnte ich auch eine Art Vorlage erstellen?

Das Problem ist: In der .csv Datei ist ja zu sehen, dass es verschiedene "point on time" (Zeile B) gibt. Diese ist eigentlich gleich mit der Weite meiner Datenvariable. Also hier 3x6, also auch "point in time" 1 bis 3. Wofür ein "point on time" aus 6 Zeilen besteht.

Gerne würde ich vielleicht also ein Muster einlesen, mit einem "point on time", und dann beliebig um n Schritte erweitern.

Verständlich? Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2017, 13:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Könnte ich auch eine Art Vorlage erstellen?

Die hast du quasi schon: deine originale .csv - Datei.
Zur besseren Flexibilität würde ich erstmal nur einen Block verwenden.

Zitat:
Gerne würde ich vielleicht also ein Muster einlesen, mit einem "point on time", und dann beliebig um n Schritte erweitern.

Unter den ersten eingelesenen Table kannst du beliebig viele weitere mit gleichen Überschriften hängen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 21.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 15:12     Titel:
  Antworten mit Zitat      
Der Code sieht aktuell wie folgt aus, funktioniert leider aber noch nicht:

Code:
T = readtable('Mappe1.csv')


n = 3

%ID
for i=1:n
    for j=1:6
     T((i*6)+j+1,1)=T(j+1,1)
    end
end

%point in time
for i=1:n  
    for j=1:6
    T((i*6)+j+1,2)=i+1
    end
end


Leider sind weitere zwei Probleme aufgetaucht:

1) Die Schleife um die ID aus der Vorlage kopieren klappt gut. Die Schleife für "point in time" klappt leider nicht. Ich bekomme immer die Fehlermeldung:
Zitat:
Right hand side of an assignment into a table must be another table or a cell array.


2) Beim versuch die Daten wieder in eine .csv zu schreiben, erhalte ich folgendes:



Alles Daten einer Reihe stehen also in einer Zelle. Wie erhalte ich mein gewünschtes Anfangsmuster?

Vielen Dank soweit!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2017, 15:20     Titel:
  Antworten mit Zitat      
Hallo,

kannst du bitte die Vorlage anhängen?

Für die zweite Schleife versuch mal
Code:
T{(i*6)+j+1,2}=i+1;


Mit welchem Aufruf erzeugst du die .csv?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 21.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 15:37     Titel:
  Antworten mit Zitat      
Also so sieht aktuell der gesamte Matlab Code aus:

Code:
%datei einlesen

Daten=[
    1,2,3,4,5,6;
    7,8,9,10,11,12;
    13,14,15,16,17,19];

%Vorlage erstellen
T = readtable('Mappe1.csv')


n = 3

%ID
for i=1:n
    for j=1:6
     T((i*6)+j+1,1)=T(j+1,1)
    end
end

%point in time
for i=1:n  
    for j=1:6
    T{(i*6)+j+1,2}=i+1;
    end
end

%Daten eintragen in "T" aus "Daten"
for i=1:n  
    for j=1:6
    T{(i*6)+j+1,6}=Daten(i,j)
    end
end


%daten schreiben
writetable(T, 'Map2.csv')


Und die Vorlage sieht so aus:


Ich habe auch einmal die Matlab Datei angehängt. Die csv Datei auch, allerdings konventiert als txt Datei, da csv verboten sit.

Dein Änderungsvorschlag hat leider nicht auf Anhieb geklappt..

Mappe1.txt
 Beschreibung:

Download
 Dateiname:  Mappe1.txt
 Dateigröße:  272 Bytes
 Heruntergeladen:  536 mal
einlesen.m
 Beschreibung:

Download
 Dateiname:  einlesen.m
 Dateigröße:  608 Bytes
 Heruntergeladen:  395 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
davido1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 21.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 15:54     Titel:
  Antworten mit Zitat      
Ich habe eine Möglichkeit gefunden zumindest den Wert zuzuweisen: Mit folgendem Code:

Code:
for i=1:n  
    for j=1:6
    T{(i*6)+j+1,2}={'0'};
    end
end
 


Bleibt noch die Frag des Exports..

Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
davido1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 21.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 21:27     Titel:
  Antworten mit Zitat      
Problem zunächst gelöst, mit:

Code:
writetable(T, 'Map2.csv','Delimiter',';')


Dann doch so einfach Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2017, 21:36     Titel:
  Antworten mit Zitat      
Hallo,

Vorschläge:

Code:
Daten=[     1,2,3,4,5,6;
    7,8,9,10,11,12;
    13,14,15,16,17,19];

%Vorlage erstellen
singleT = readtable('Mappe1.csv', 'HeaderLines', 1)


n = 3

%% ID
T = table();
for i=1:n
    T = [T; singleT];
end

%% point in time
for i=1:n  
    for j=1:6
        T{((i-1)*6)+j,2}=i;
    end
end

%% Daten eintragen in "T" aus "Daten"
for i=1:n  
    for j=1:6
        T{((i-1)*6)+j,6}=Daten(i,j);
    end
end


%% daten schreiben
writetable(T, 'Map2.csv', 'Delimiter', ',')


Wenn Dateien nicht angehängt werden können, bitte zippen. Der kleine Unterschied zwischen .txt und .csv kann schnell mal zu einem anderen Verhalten führen.

Grüße,
Harald
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.