Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neue Logikbausteine für den L1/X1: Formelberechnung, Statistik und mehr...
Vielleicht findet sich ja jemand, der einen LBS schreibt, der aus einem CSV (Comma Seperated Values) -string einen sortierten (wahlweise auf- und abwärts) macht.
EInfacher wär wahrscheinlich, ich bau' eine entprechende Funktion in die Formelberechnung ein ... oder jemand anders erbarmt sich, der Quellcode ist ja offen.
Jedenfalls hab ich für beide hier gefundenen Punkte in Github mal entsprechende Tickets auf gemacht:
Gestern und heute hatte ich etwas Zeit, die beiden neulich eingegebenen Tickets anzugehen. Folgende Erweiterung der Formelberechnung ist dabei raus gekommen:
Funktionen zur Verarbeitung von Daten in eindimensionalen Feldern
.NET 4.0 stellt in den String- und Array-Klassen Methoden bereit, mit denen sich eindimensionale Felder von Zahlen oder Texten erzeugen und weiter verarbeiten lassen. Die Methoden der Erweiterungsklasse Data ergänzen diese so, dass mehrere Verarbeitungsschritte in einem Ausdruck auch in solchen Fällen möglich werden, wo dies allein mit .NET nicht möglich wäre:
Data.ConvertDoubles(input)
string[] → double[]
Vereinfacht gegenüber der .NET-Methode Array.ConvertAll, ein Feld von Textstrings in ein Feld von Fließkommazahlen zu konvertieren, wenn dabei . als Dezimaltrennzeichen und ggf. , als Gruppentrennzeichen interpretiert werden soll.
Data.Sort(values, comparer)
values: Eindimensionales Feld
comparer: optionaler Lambdaausdruck zur Festlegung der Sortierreihenfolge (aufsteigend falls nicht gegeben)
Sortiert das gegebene Feld von Werten aufsteigend (wenn kein comparer gegeben ist) oder gemäß der vom comparer gegebenen Ordnung.
Im Gegensatz zur .NET-Methode Array.Sort besteht gibt siese Methode das sortierte values-Feld auch zurück. Dadurch kann es im gleichen Ausdruck weiter verarbeitet werden.
Data.Join(separator, values, startIdx, length)
separator: string
values: Eindimensionales Feld
startIdx: erstes auszugebendes Element (falls nicht gegeben: 0)
length: Anzahl der auszugebenden Elemente (falls nicht oder zu groß gegeben: alle bis zum Ende des Felds)
Verkettet Werte des gegebenen Feldes values zu einem Ausgabe-Textstring, indem die einzelnen Werte formatiert und durch den gegebenen separator voneinander getrennt werden.
werden dabei Fließkommazahlen ohne Gruppentrennzeichen und mit . als Dezimaltrennzeichen formatiert,
kann mit den optionalen Parametern startIdx und length wahlweise nur ein Teil der Feldelemente ausgegeben werden.
Da Datenfeld-Typen für Ausgänge des Bausteins nicht direkt verwendbar sind, muss die letze Operation auf einem Feld immer einen zulässigen Ausgabetyp erzeugen. In Frage kommen dafür vor allem:
Auswahl eines einzelnen Werts mit dem Indexoperator [n],
Verkettung mehrerer Werte zu einem Textstring mit einer der Join-Varianten.
Die zweite Variante erlaubt auch, ein Feld in einer nachfolgenden Formel weiter zu verarbeiten, indem der Text dort zunächst wieder in ein Feld konvertiert wird.
Beispiel 1: Ausgabe des zweitgrößten Werts einer Zahlenmenge
Data.Sort( Data.ConvertDoubles({text:S}.Split(';')), (a, b) => b.CompareTo(a) ) [1]
Die verwendeten Funktionen im Einzelnen:
{text:S}.Split(';') zerlegt den Eingabetext anhand der darin enthaltenen Trennzeichen ; in ein Feld von Texten
Data.ConvertDoubles(...) erzeugt daraus ein Feld von Fließkommazahlen
Data.Sort(...) sortiert dieses Feld ...
... wobei der Lambdaausdruck (a, b) => b.CompareTo(a) die Elemente in absteigender Reihenfolge anordnet
Der Indexoperator ... [1] wählt aus dem Feld das zweite, also zweitgrößte Element aus
Beispiel 2: Ausgabe der drei kleinsten positiven Ganzzahlen einer Zahlenmenge
Data.Join( ", ", Data.Sort( Array.FindAll( Array.ConvertAll({text:S}.Split(','), int.Parse), x => (x > 0) ) ) , 0, 3 )
Die verwendeten Funktionen im Einzelnen:
{text:S}.Split(',') zerlegt den Eingabetext anhand der darin enthaltenen Trennzeichen , in ein Feld von Texten
Array.ConvertAll(..., int.Parse) erzeugt daraus ein Feld von Ganzzahlen
Array.FindAll( ..., x => (x > 0) ) wählt aus dem Feld mit dem Lambda-Operator alle positiven Elemente aus
Data.Sort( ... ) sortiert diese positiven Werte aufsteigend
Data.Join( ", ", ..., 0, 3 ) formatiert die ersten bis zu drei Zahlen des verbleibenden Feldinhalts als Komma-separierten Text
Zuletzt geändert von hyman; 28.11.2023, 08:08.
Grund: Bausteinpaket in der Version 1.6.1 ist jetzt freigegeben und liegt in der Download-Area.
Hallo Hyman,
mit dem aufrichtigen Ausdruck meiner Bewunderung möchte ich mich (sicherlich nicht nur für mich) bedanken und bestätigen, dass offensichtlich alles funktioniert wie beschrieben und wirklich sehr hilfreich ist. Wie schreibt man in solchen Foren, wenn man wirklich zufrieden ist? Ohne dass es furchtbar übertrieben wirkt? Ich hoffe, ich habe den richtigen Ton getroffen.
Beste Grüße Wehner123
Ich habe soeben die Version 1.6.1 des Pakets Visu- & Web-Logikbausteine freigegeben.
Verbesserung an der Formelberechnung:
Neue Methoden der Data-Klasse erlauben die Verarbeitung von indimensionalen Datenfeldern aus Zahlen oder Texten. Näheres dazu (auch Beispiele) finden sich in der Dokumentation zum Baustein (oder vorab im Post #288)
Entschuldige meine Frage aber ich stehe auf dem Schlauch gerade:
Möchte eine Formel als Trigger nutzen "_out2_ == _previousOut2_ ? 0 : 1" aber beim initialisieren erhalte ich immer eine 0 und würde gerne eine 1 erhalten. Hast DU einen Tipp für mich?
Sorry anbei ein paar Screenshots. Ich möchte auf Basis der Scharfschaltung und aktuellen Szene ein Web-Request mit Parameter triggern. Dieser Request stellt über meine eigene API den aktuellen Status der Öffnungszeiten für Web und Digital-Signage ein.
Obwohl das allein sicher nicht hilft, würde ich den Typ des Ausgangs 2 auf INTEGER stellen. Fließkommazahlen brauchst Du da nicht. Wenn ich das richtig verstehe, nimmt Ausgang 2 nur die Werte 0 (geschlossen), 1 (geöffnet) oder 2 (geöffnet im shooting) an. Soweit richtig?
Den Initialwert für _previousOut2_ kannst Du nicht beeinflussen. Du kannst aber den Wertebereich des Ausgangs 2 so ändern, dass 0 nicht vorkommet, z. B. 1 (geschlossen), 2 (geöffnet) oder 3 (geöffnet im shooting). Dann musst Du "nur noch" die Formeln 4 und 5 entsprechend anpassen.
Spannend finde ich übrigens die Addition/Verkettung eines Strings und einer Zahl in Formel 4. Ich wusste nicht, dass sowas funktioniert ...
Du kannst aber den Wertebereich des Ausgangs 2 so ändern, dass 0 nicht vorkommet
Spannend finde ich übrigens die Addition/Verkettung
Lieben Dank, werde ich ausprobieren - muss nur dazu noch die API anpassen. Das mit der Verkettung habe ich einfach ausprobiert und dann einen anderen LBS für den Web-Request genommen, bei dem ich die URL als Parameter übergeben kann.
Lieben Dank, werde ich ausprobieren - muss nur dazu noch die API anpassen.
Die API kannst Du so lassen. Du musst nur Formel 4 entsprechend anpassen: _out1_ + (_out2_ - 1)
Damit werden für den Status in der URL wieder die Werte 0 bis 2 verwendet wie bisher.
Und Formel 5 musst Du natürlich auch ändern, aber da dürfte klar sein wie ...
Um mit den Werten konsistent zu sein, habe ich die API ja schon geändert. Die Screenshots zeigen das Live-Ergebnis (Der Status wird über AJAX alle 10 Sekunden abgefragt). Danke Dir!
Nicht wirklich schlaflos aber wach geworden und an den Rechner - heute muss ich früh auf der "Baustelle" sein (50 Meter 3P-DALI-Schiene werden nachher geliefert).
Funktionen zur Verarbeitung von Daten in eindimensionalen Feldern
Guten Morgen,
Bin gerade dabei mit Deinen neuen Funktionen ein wenig zu testen.
Wäre es technisch möglich
- auf einen Eingang ein JSON-Array zu legen in der Form "{key1:"value2",key2:"value2"}" welches per Web-Request bereitgestellt wird
- auf einen zweiten Eingang einen Integer-Wert
um auf einem weiteren Ausgang die passende "value" des "keys" vom zweiten Eingang zu haben?
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar