DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Bedingte klassierung vbs-script

Hallo an alle,

 

ich bin noch ziemlich neu im Umgang mit DIAdem und VBS-Script, habe aber schon sehr viel mit Excel VBA programmiert.

Zur Zeit versuche ich ein paar Arbeitsschritte zu Sparen und diese aus Excel in Diadem zu verlagern.

 

Problem:

Ich habe sehr viele Dateien mit Messdaten (ca. 34 Spalten/ Kanäle x 30000 Zeilen / Werte). In Spalte 30 steht entweder eine 0 oder eine 1 und in Spalte 31 eine 1, 2 oder 3.

Jetzt habe ich früher mit Excel die Daten in neue Tabellen einsortiert -> 6 Stück für jeden Fall eine (also 0-1, 0-2, 0-3, 1-1, 1-2, 1-3) und danach dann einfach die Klassierung in Diadem gestartet. Diesen Schritt würde ich mir gern Sparen und in DIAdem eine "Bedingte Klassierung" machen, d.h. DIA soll Klassieren und bei jedem Wert zusätzlich die Spalten 30 und 31 prüfen um die Häufigkeit in den Richtigen Ergebniskanal zu Speichern.

Habe schon viel Probiert aber leider bisher nicht sehr Erfolgreich.

Ich Poste hier mal mein Codeansatz:

 

'------------------------------------------------------------------------------- '-- VBS-Script-Datei '-- Neu erstellt am 07.10.2009 12:37:42 '-- Ersteller: XXX -- STG '-- Kommentar: '------------------------------------------------------------------------------- Option Explicit 'Erzwingt die explizite Deklaration aller Variablen in einem Skript. Dim MyChnName MyChnName = ChnLinGen("[1]/Häufigkeit Fxul_ZS1",0,0,128) MyChnName = ChnLinGen("[1]/Häufigkeit Fxul_ZS2",0,0,128) MyChnName = ChnLinGen("[1]/Häufigkeit Fxul_ZS3",0,0,128) MyChnName = ChnLinGen("[1]/Häufigkeit Fxul_ZF1",0,0,128) MyChnName = ChnLinGen("[1]/Häufigkeit Fxul_ZF2",0,0,128) MyChnName = ChnLinGen("[1]/Häufigkeit Fxul_ZF3",0,0,128) Dim oMyResultsList, Element Set oMyResultsList = Navigator.Display.CurrDataProvider.ResultsList For Each Element in oMyResultsList.Elements If Element.IsKindOf(eSearchFile) Then Call Navigator.LoadData(Element,"Load") 'Datei laden dim myZwSp_ZS1 dim myZwSp_ZS2 dim myZwSp_ZS3 dim myZwSp_ZF1 dim myZwSp_ZF2 dim myZwSp_ZF3 '###############################################################################​#################################################### '###############################################################################​#################################################### '###############################################################################​#################################################### '###############################################################################​#################################################### 'Spitzen mit NoValue ersetzen! 'Min: ################################################################################​############################################## Call ChnCalculate("Ch(""[2]/[1]"")=Ch(""[2]/[1]"")+CTNV(Ch(""[2]/[1]"")<(-70.927))") 'Fxul 'Max: ################################################################################​############################################## Call ChnCalculate("Ch(""[2]/[1]"")=Ch(""[2]/[1]"")+CTNV(Ch(""[2]/[1]"")>(158.884))") 'Fxul '###############################################################################​#################################################### '###############################################################################​#################################################### '###############################################################################​#################################################### '###############################################################################​#################################################### ClassNo = 128 ClassBegin = -72.7539444444445 ClassEnd = 160.710944444444 Call ChnHistogram("[2]/Fxul [kN]","[1]/Klassen Fxul", _ (Select Case Ch("[2]/[30]") Case 0 myZwSp_ZS1 'nur Testweise, hier müsste eine 2. Select case anweisung mit 3 Cases stehen Case 1 myZwSp_ZF3 'nur Testweise, hier müsste eine 2. Select case anweisung mit 3 Cases stehen End Select), _ "NoBeginEnd","absolute") '... Y,E,E,ClassMeth1,FrequencyType ChnAdd"[1]/Häufigkeit Fxul_ZS1",myZwSp_ZS1,"[1]/Häufigkeit Fxul_ZS1" 'Kanäle kopieren (Kanal1 + Kanal2 = Kanal3) ChnAdd"[1]/Häufigkeit Fxul_ZF3",myZwSp_ZF3,"[1]/Häufigkeit Fxul_ZF3" 'Kanäle kopieren (Kanal1 + Kanal2 = Kanal3) Call GroupDel(2) 'beim Laden neu entstandene, Gruppen löschen End If Next

 

 

So, ich hoffe Ihr versteht mein Anliegen und könnt mir vielleicht weiterhelfen.

Für eure Hilfe schonmal vielen Dank im vorraus.

Viele Grüße

STG82

0 Kudos
Message 1 of 7
(5,170 Views)

Hallo STG82,

 

wenn ich es richtig verstanden habe, soll das Ergebnis aus 6 Klassierungen bestehen.

Dabei legen zwei Spalten (30 und 31) zeilenweise die Zuordnung der Daten aus den restlichen Kanälen zu den 6 Klassierungen fest.  

 

Eine fertige Funktion "bedingte Klassierung" gibt es nicht. (Dabei wäre vermutlich auch die Performance nicht so berauschend.)

 

Ich würde daher wie folgt an die Aufgabe herangehen:

 

 1. Zeilenweise die Kanalwerte in 6 temporäre Datenkanäle einfügen

 2. Über diese temporäre Datenkanäle die Klassierung (ChnHistogram) laufen lassen

     --> 12 Ergebniskanäle:  6 x (Anzahl der Werte pro Klasse + zugehörige Klassenmitten)

 3. Die temporären Kanäle wieder löschen und - wenn nicht mehr benötigt - auch die Kanäle mit den Klassenmitten

 

Dies sollte bei halbwegs geschickter Programmierung die schnellste Lösung darstellen.

 

Mit freundlichen Grüßen

Ralf N.

 

PS: Wenn ich es noch schaffe, stelle ich auch ein kleines Beispiel rein...

Message Edited by ralfn on 02-12-2010 07:43 AM
0 Kudos
Message 2 of 7
(5,121 Views)

Hier finden sich übrigens sehr interessante Anregungen für die Skript-Programmierung.
Dinge die jeden wissen sollte!!!

 

http://www.diadem-forum.de/diadem-tutorials-f-6.html

 

 

Kleiner Vorgeschmack:

 

Hinweise und Tipps und Tricks bei der Script-Erstellung
http://www.diadem-forum.de/hinweise-und-tipps-und-tricks-bei-der-script-t-46.html

 

Performance in DIAdem: Optimales Lesen und Schreiben von Kanaldaten
http://www.diadem-forum.de/performance-diadem-optimales-lesen-und-schreiben-von-kanaldaten-t-66.html

0 Kudos
Message 3 of 7
(5,117 Views)

Hallo STG82,

 

hier wie versprochen das Beispiel.

 

Es lässt sich sicherlich an der ein oder anderen Stelle noch optimieren, was bspw. die Performance anbetrifft.

 

Eine erfolgreiche Woche wünscht

 

Ralf N.

0 Kudos
Message 4 of 7
(5,085 Views)

Hallo RalfN,

vielen Dank für Deine Hilfe erstmal. Das Script ist erstmal ein guter Ansatz, funktioniert nur leider noch nicht so wie es soll.

Also die Tabellen bzw. Daten sehen bei mir so aus: 33 Spalten und max 30000 Zeilen.

Spalte 30 = 0 ODER 1

Spalte 31 = 1, 2, oder 3

 

Spalte 32 = 0, 1, 2, 3 wird nicht benötigt für Klassierung

Spalte 33 = Uhrzeit - wird auch nicht benötigt für Klassierung

Spalte 1...29 sind die zu Klassierenden Daten

 

Nach Deinem Ansatz versuche ich jetzt das Script so zu ändern das Zuerst 6 Gruppen mit 29x2 Kanälen x 128 Zeilen für die Klassengrenzen und Häufigkeiten erstellt werden.

 

Dann müssten 6 Gruppen "Testgruppe0_1" "Testgruppe0_2" "Testgruppe0_3" "Testgruppe1_1" usw. erstellt werden mit 33 Kanälen und variabler Zeilenlänge (max 30000).

Dies sind die Gruppen 7 bis 12.

 

'(#§$* )

 

Dann müsste ein Datensatz geöffnet werden, über Ordnerangabe oder Datafinderergebnisliste. Das wird die Gruppe 13

Danach die Daten aus der 13. Gruppe anhand der Spalten 30 und 31 in die Gruppen 7..12 einsortieren

 

Am besten wäre es wenn Dia in Gruppe 13 Spalte 30 und 31 (Auswahl über Gruppennummer da jeder Datensatz anders heißt) schaut und dann die Gesamte Zeile in die jeweilige Gruppe (7...12) einfügt. Das wäre dann wie folgt:

 

Gruppe 13 Spalte 30=0, Spalte 31=1 ---> Gesammte Zeile in Gruppe 7 Ch 1 - 33 einfügen

Gruppe 13 Spalte 30=0, Spalte 31=2 ---> Gesammte Zeile in Gruppe 8 Ch 1 - 33 einfügen

Gruppe 13 Spalte 30=0, Spalte 31=3 ---> Gesammte Zeile in Gruppe 9 Ch 1 - 33 einfügen

 

Gruppe 13 Spalte 30=1, Spalte 31=1 ---> Gesammte Zeile in Gruppe 10 Ch 1 - 33 einfügen

Gruppe 13 Spalte 30=1, Spalte 31=2 ---> Gesammte Zeile in Gruppe 11 Ch 1 - 33 einfügen

Gruppe 13 Spalte 30=1, Spalte 31=3 ---> Gesammte Zeile in Gruppe 12 Ch 1 - 33 einfügen

 

Danach kann die Gruppe 13 Gelöscht werden.

 

Jetzt die Daten aus Gruppe 7 in Gruppe 1 Klassieren.

Dann Daten aus Gruppe 8 in Gruppe 2 Klassieren. 

Dann Daten aus Gruppe 9 in Gruppe 3 Klassieren.

Dann Daten aus Gruppe 10 in Gruppe 4 Klassieren.

Dann Daten aus Gruppe 11 in Gruppe 5 Klassieren.

Dann Daten aus Gruppe 12 in Gruppe 6 Klassieren.

 

Dies müsste aber auch über ein Zwischenkanal gemacht werden damit ich die Häufigkeiten der Datensätze zusammenrechnen kann.

 

ChnAdd"[1]/Häufigkeit Fxul",myZwSp,"[1]/Häufigkeit Fxul"

 

Dann müsste der nächste Datensatz geöffnet werden und das Spiel beginnt wieder ab '(#§$* )

 

Kämpfe hier schon fleissig und versuche aus meinen ganzen script-schnipseln was zu Zaubern, aber die Befehle sind schon sehr verschieden zu Excel VBA was es wirklich super erschwert.

 

Ich gucke mal was ich noch so zusammenbekomme und Poste das Ergebnis hier falls was brauchbares rauskommt. Für weitere Hilfe und anstöße bin ich sehr Dankbar.

 

Viele Grüße erstmal und bis bald

STG 

 

 

0 Kudos
Message 5 of 7
(5,077 Views)

Zu dem neuen Ansatz habe ich mir Überlegt die ersten 6 Gruppen schon als Vorlage zu erstellen - somit spar ich mir das schonmal im Script und habe zudem die Richtige Bezeichnung der Kanäle.

Dabei fiel mir auf das nicht 58 sondern nur 52 Kanäle für die Klassierung benötigt werden.

Aber viel einfacher machts das nicht. Ich bastel jetzt mal weiter an meinen Script-Schnipseln.

Bis dann und viele Grüße
STG

 

 

0 Kudos
Message 6 of 7
(5,073 Views)

Hab jetzt schonmal ein kleines Grundgerüst erstellt mit den Sachen die schon funktionieren....

 

'------------------------------------------------------------------------------- '-- VBS-Script-Datei '-- Neu erstellt am 15.02.2010 13:02:17 '-- Ersteller: STG '-- Kommentar: Bedingte Klassierung - Vorlage Bedingte Klassierung muss geöffnet sein! '------------------------------------------------------------------------------- Option Explicit 'Erzwingt die explizite Deklaration aller Variablen in einem Skript. Dim iChn, iRow, oMyChn, oMyGrp Call Data.Root.Clear 'löscht alle Daten Dim oMyResultsList, Element Set oMyResultsList = Navigator.Display.CurrDataProvider.ResultsList For Each Element in oMyResultsList.Elements If Element.IsKindOf(eSearchFile) Then Call Navigator.LoadData(Element,"Load") 'Datei laden dim myZwSp '################################################################################################################################### '################################################################################################################################### '################################################################################################################################### 'Spitzen mit NoValue ersetzen! Call ChnCalculate("Ch(""[7]/[1]"")=Ch(""[7]/[1]"")+CTNV(Ch(""[7]/[1]"")<(-70.927)) Or Ch(""[7]/[1]"")>(158.884))",NULL,NULL,"") 'Fxul Call ChnCalculate("Ch(""[7]/[2]"")=Ch(""[7]/[2]"")+CTNV(Ch(""[7]/[2]"")<(-7.007)) Or Ch(""[7]/[2]"")>(37.83))",NULL,NULL,"") 'Fzul Call ChnCalculate("Ch(""[7]/[3]"")=Ch(""[7]/[3]"")+CTNV(Ch(""[7]/[3]"")<(-47.312)) Or Ch(""[7]/[3]"")>(35.23))",NULL,NULL,"") 'Fxur Call ChnCalculate("Ch(""[7]/[4]"")=Ch(""[7]/[4]"")+CTNV(Ch(""[7]/[4]"")<(5.557)) Or Ch(""[7]/[4]"")>(41.777))",NULL,NULL,"") 'Fzur Call ChnCalculate("Ch(""[7]/[5]"")=Ch(""[7]/[5]"")+CTNV(Ch(""[7]/[5]"")<(-10.953)) Or Ch(""[7]/[5]"")>(13.234))",NULL,NULL,"") 'Fxrl Call ChnCalculate("Ch(""[7]/[6]"")=Ch(""[7]/[6]"")+CTNV(Ch(""[7]/[6]"")<(-1.913)) Or Ch(""[7]/[6]"")>(81.966))",NULL,NULL,"") 'Fzrl Call ChnCalculate("Ch(""[7]/[7]"")=Ch(""[7]/[7]"")+CTNV(Ch(""[7]/[7]"")<(-26.047)) Or Ch(""[7]/[7]"")>(22.44))",NULL,NULL,"") 'Fxrr Call ChnCalculate("Ch(""[7]/[8]"")=Ch(""[7]/[8]"")+CTNV(Ch(""[7]/[8]"")<(-24.384)) Or Ch(""[7]/[8]"")>(109.027))",NULL,NULL,"") 'Fzrr Call ChnCalculate("Ch(""[7]/[9]"")=Ch(""[7]/[9]"")+CTNV(Ch(""[7]/[9]"")<(-15.029206)) Or Ch(""[7]/[9]"")>(15.834908))",NULL,NULL,"") 'Strl Call ChnCalculate("Ch(""[7]/[10]"")=Ch(""[7]/[10]"")+CTNV(Ch(""[7]/[10]"")<(-46.295417)) Or Ch(""[7]/[10]"")>(42.189006))",NULL,NULL,"") 'Sbrl Call ChnCalculate("Ch(""[7]/[11]"")=Ch(""[7]/[11]"")+CTNV(Ch(""[7]/[11]"")<(-11.700048)) Or Ch(""[7]/[11]"")>(20.802038))",NULL,NULL,"") 'Strr Call ChnCalculate("Ch(""[7]/[12]"")=Ch(""[7]/[12]"")+CTNV(Ch(""[7]/[12]"")<(-52.824427)) Or Ch(""[7]/[12]"")>(52.947037))",NULL,NULL,"") 'Sbrr Call ChnCalculate("Ch(""[7]/[13]"")=Ch(""[7]/[13]"")+CTNV(Ch(""[7]/[13]"")<(53.265)) Or Ch(""[7]/[13]"")>(53.857))",NULL,NULL,"") 'Sztl Call ChnCalculate("Ch(""[7]/[14]"")=Ch(""[7]/[14]"")+CTNV(Ch(""[7]/[14]"")<(48.078)) Or Ch(""[7]/[14]"")>(53.337))",NULL,NULL,"") 'Sztr Call ChnCalculate("Ch(""[7]/[15]"")=Ch(""[7]/[15]"")+CTNV(Ch(""[7]/[15]"")<(-0.519)) Or Ch(""[7]/[15]"")>(0.285))",NULL,NULL,"") 'Fxs1 Call ChnCalculate("Ch(""[7]/[16]"")=Ch(""[7]/[16]"")+CTNV(Ch(""[7]/[16]"")<(-0.179)) Or Ch(""[7]/[16]"")>(0.48))",NULL,NULL,"") 'Fzs1 Call ChnCalculate("Ch(""[7]/[17]"")=Ch(""[7]/[17]"")+CTNV(Ch(""[7]/[17]"")<(-0.391)) Or Ch(""[7]/[17]"")>(0.166))",NULL,NULL,"") 'Fxs2 Call ChnCalculate("Ch(""[7]/[18]"")=Ch(""[7]/[18]"")+CTNV(Ch(""[7]/[18]"")<(-0.257)) Or Ch(""[7]/[18]"")>(0.232))",NULL,NULL,"") 'Fzs2 Call ChnCalculate("Ch(""[7]/[19]"")=Ch(""[7]/[19]"")+CTNV(Ch(""[7]/[19]"")<(-4.155)) Or Ch(""[7]/[19]"")>(1.467))",NULL,NULL,"") 'Fz_Rolle Call ChnCalculate("Ch(""[7]/[20]"")=Ch(""[7]/[20]"")+CTNV(Ch(""[7]/[20]"")<(-2.006)) or Ch(""[7]/[20]"")>(3.676))",NULL,NULL,"") 'Fz_Halter Call ChnCalculate("Ch(""[7]/[21]"")=Ch(""[7]/[21]"")+CTNV(Ch(""[7]/[21]"")<(-186.138)) Or Ch(""[7]/[21]"")>(93.955))",NULL,NULL,"") 'Fzl Call ChnCalculate("Ch(""[7]/[22]"")=Ch(""[7]/[22]"")+CTNV(Ch(""[7]/[22]"")<(-237.714)) Or Ch(""[7]/[22]"")>(89.617))",NULL,NULL,"") 'Fzr Call ChnCalculate("Ch(""[7]/[23]"")=Ch(""[7]/[23]"")+CTNV(Ch(""[7]/[23]"")<(-8.612537)) Or Ch(""[7]/[23]"")>(8.028389))",NULL,NULL,"") 'azZ Call ChnCalculate("Ch(""[7]/[24]"")=Ch(""[7]/[24]"")+CTNV(Ch(""[7]/[24]"")<(-30.57054)) Or Ch(""[7]/[24]"")>(41.540492))",NULL,NULL,"") 'azRl Call ChnCalculate("Ch(""[7]/[25]"")=Ch(""[7]/[25]"")+CTNV(Ch(""[7]/[25]"")<(-11.538514)) Or Ch(""[7]/[25]"")>(12.791077))",NULL,NULL,"") 'azRr Call ChnCalculate("Ch(""[7]/[26]"")=Ch(""[7]/[26]"")+CTNV(Ch(""[7]/[26]"")<(-10.471194)) Or Ch(""[7]/[26]"")>(9.086721))",NULL,NULL,"") 'azT '################################################################################################################################### '################################################################################################################################### '################################################################################################################################### 'Hier bedingte Klassierung oder erst teilen und dann Klassieren! End If Next

 

 Ab hier wirds wieder kompliziert...

Ich probier mal was ich noch so zusammenbringe.

MfG RIchard

 

0 Kudos
Message 7 of 7
(5,068 Views)