• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

CSV-Export mit QSA

suedfrucht

New member
Hallo allerseits,

ich arbeite für eine Studienarbeit mit der Mehrkörpersimulationssoftware Simpack und benötige dort ein Skript zum automatischen Datenexport. Leider scheint Simpack das einzige Programm auf der Welt zu sein, das QSA überhaupt noch benutzt und so ist Hilfe im Internet rar. Auch die Dokumentation, die mir helfen sollte, ist relativ knapp und teilweise unvollständig. Das erschwert die ganze Sache zusätzlich.

Da QSA und qt und wie sie nicht alle heißen anscheind zur gleichen Skriptsprachenfamilie wie JavaScript gehört, versuche ich nun mal bei Euch mein Glück - ich hoffe Ihr könnt mir vielleicht helfen!

Das Problem:

Simpack verfügt über einen eigenen Postprozessor, der reicht mir aber nicht aus. Ich möchte daher die Messpunkt in das Tabellenformat CSV überführen um es dann in Matlab auszulesen. Dafür möchte ich gerne jede der Kurven einer Datei in eine Spalte der CSV schreiben.
So weit bin ich bisher:

Code:
function CurveExport()
{
    var project = Application.Spck.openProject("C:/.../Einzelraddoppelfahrwerk_v_var_60sekunden.spf");
    
    outfile = new File("C:/.../Mappe1.csv");
    outfile.open(File.WriteOnly);
    
    for(var isbr=0; isbr <5; isbr++)
    {
	
    outfile.write(";  ");
    var sbr = project.getResultFile(isbr);    

    for(var i=1; i< sbr.getChild(1).getChild(7).getChild(1).numValues; i++)
         {
	
         var Child = sbr.getChild(1).getChild(7).getChild(1).values[i];
         outfile.write(Child+"\n");
    
         }
    }	
}

Bisher entsteht so leider nur Kraut und Rüben in der CSV. Zwar erstellt die outfile.write(Child+"\n") jeden neuen Datenpunkt in einer neuen Zelle, senkrecht untereinander, so wie ich es will - die Crux ist aber die outfile.write("; ") zu Beginn, die eigentlich erreichen soll, dass für jede sbr eine neue Spalte begonnen wird. Ich hab die halbe Woche nach einem solchen Befehl gesucht und nichts gefunden. Programmieren ist auch nicht mein liebstes Hobby - deshalb hoffe ich bei Euch die ersehnte Hilfe zu finden.

Lieben Gruß,
suedfrucht
 
Das Problem an sich habe ich noch nicht verstanden.
Das Semikolon ist doch das korrekte Spaltentrennzeichen. Liegt es also nicht eher am einlesenden Programm, wenn da keine neue Spalte erkannt wird?
Oder anders herum, welches Zeichen würde denn benötigt, damit das gewünschte Ziel erreicht wird?

Zeig doch mal einen Ausschnitt der jetzt erzeugten CSV und darunter das selbe wie es aussehen müsste.
 
Was du da beschreibst ist ein typisches CSV Schreibeproblem: Dateien werden zeilenweise geschrieben, deine Daten hast du aber in Spaltenform.

Dafür gibt es jetzt zwei Lösungen: entweder du schreibst deine Daten in die Zeilen - in deinem Code also ";" und "\n" vertauschen (ist der einfachstere Weg, aber MATLAB untersützt den Import da nicht so gut) - oder du liest deine Daten zeilenweise aus.
Der zweite Weg würde in etwa so aussehen:
Code:
function CurveExport(){
	var project = Application.Spck.openProject("C:/.../Einzelraddoppelfahrwerk_v_var_60sekunden.spf");

	outfile = new File("C:/.../Mappe1.csv");
	outfile.open(File.WriteOnly);

	var firstFile = project.getResultFile(0);
	for (var i = 1; i < firstFiler.getChild(1).getChild(7).getChild(1).numValues; i++){
		for (var isbr = 0; isbr < 5; isbr++){
			outfile.write(project.getResultFile(isbr).getChild(1).getChild(7).getChild(1).values[i] + ";");
		}
		outfile.write("\n");
	}
}
- ungetestet.
Damit bekommst du aber massive Probleme, wenn deine einzelnen Datentraces unterschiedlich lang sind.

PS: besonders schön und performant ist mein Code noch nicht...
 
Hallo, vielen Dank schonmal für Eure Antworten!

mikdoe, ich hänge Dir mal an, was mein Skript fabriziert - aber ich denke es ist wirklich das Spalten/Zeilen-Ding des CSV formats...

kkapsner, das mit der Spaltenproblematik des CSV-Formats war mir so nicht bewusst. Die Idee mit dem Vertauschen hatte ich auch, klappte auch wunderbar, aber da macht einem Matlab dann nen Strich durch die Rechnung - denn wenn ich das dann alles wieder manuell importieren muss, habe ich durch das Skript ja leider nichts gewonnen. Dein umgebautes Skript funktioniert schonmal sehr viel besser. Es entstehen ein paar Lücken - was ich aber gerade feststelle ist, dass die Werte in der CSV, zum Teil sehr klein und in Exponentenschreibweise, komplett falsch an die CSV übergeben werden. Erkenne da auch noch keine Regelmäßigkeit.

Gelangt CSV da vielleicht an seine Grenzen? Wenn ich die Werte einfach über einen System.print ansteuere, gibt mir die Konsole richtigerweise Werte in der Form: "-8.663208191995227E-15" aus. In der CSV erscheint eben jener Wert als "-8,66320819199522", in anderen Zellen werden aus deutlich negativen Exponenten plötzlich positive etc. Warum übernimmt die CSV nicht einfach den Wert, den mein Skript übergibt?

Fällt Euch ein anderes, vielleicht besser geeignetes Dateiformat ein, dass man vielleicht nutzen könnte (auch vor dem Hintergrund, dass es der Matlab Import erkennt?)

mappe1.PNG

Hier das Bild, nach meinem Ursprünglichen Skript, einer der Werte springt nach rechts, die anderen wieder nach links...

mappe4.PNG

Dies ist das Ergebnis mit dem neuen Skript, sehr viel besser, fünf Spalten aus fünf Datensätzen, ein Wert tanzt irgendwie aus der Reihe, aber das wäre zu verschmerzen. Leider haben die Werte aber durch die Exponenten nichts mehr mit den Messwerten zu tun.
 
Die Ansicht mit Excel ist jetzt gerade nicht hilfreich, weil Excel ja schon wieder durch seine Interpretationsversuche des Spaltenaufbaus und des Inhalts die Hälfte falsch macht.
Zeig mal wie das in einem Dateibetrachter in Rohform aussieht.
 
Was der Excel-Import aus den Dateien macht, ist erst einmal uninteressant - wie sieht denn der Inhalt der .csv-Datei genau aus (also in einem Texteditor ansehen)?
 
Okay, das war jetzt zugegebenermaßen blöd von mir, aber man lernt stets dazu.

Hier zwei Screenshots, bin mir jedoch nicht so sicher, ob die wirklich weiterhelfen. Das Semikolon ist überall zu sehen, die "\n"s werden jedoch nicht angezeigt. Blendet die selbst der Editor aus? Die Datei kann ich hier leider nur bis 100kb hochladen, weswegen die letzten zwei Drittel fehlen - hoffe da ist beim speichern im Editor nicht schon wieder irgendwas verlorengegangen. Ist jetzt in Codierung ANSI gespeichert, leider hab ich auch hiervor keine Ahnung.

Anhang anzeigen Mappe4_ein_drittel.txt

mit_zeilenumbruch.jpgohne_zeilenumbruch.jpg

einmal mit, einmal ohne Zeilenumbruch

Danke für Eure Hilfe!
 
Also die .txt sieht jetzt, bis auch das "; "am Anfang, ganz gut aus.

Zeig' mal den genauen Coden, den du jetzt zum Generieren verwendest.

PS: Wenn in Windows Deutsche Zahlendarstellung eingestellt ist (also ein Komma als Dezimalzeichen), kann Excel Zahlen, die mit Punkt als Dezimalzeichen dargestellt werden, nicht richtig importieren.
 
Hallo Ihr beiden,

es hat nun tatsächlich wunderbar geklappt. Die erste Skriptverbesserung von Dir, kkapsner, hat funktioniert. Ich hatte noch irgendwo Fragmente meines Skripts nicht auskommentiert und daher die leere Zelle am Anfang. Matlab mochte die Daten aber trotzdem noch nicht. Der Zaubertrick war, das Trennzeichen ';' durch ein effes ',' zu ersetzen. Blöd wenn jedes Programm da irgendwie sein eigenes Süppchen kocht und einen so ein Mist dann drei Tage kostet.

Vielen, vielen Dank Euch beiden, Ihr habt mir verdammt weitergeholfen!

Lieben Gruß
suedfrucht
 
Äh - bei MATLAB kann man einstellen, welches Trennzeichen verwendet wird... ist auf jeden Fall bei R2013a so.

Aber auch gut, wenn dein Skript jetzt so funktioniert... also auch von mir ein: Bitte - gern geschehen.
 
Zurück
Oben