Ankündigung

Einklappen
Keine Ankündigung bisher.

find Funktion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    find Funktion

    Hallo Zusammen,

    ich versuche heute schon seit mehreren Stunden mit der find Funktion eine CSV Liste zu parsen. Dabei treibt mich der Pos1 Parameter der Funktion in den Wahnsinn.




    find (String1, String2, Pos1)

    Die Beschreibung dazu ist auch nicht wirklich hilfreich:
    Pos1: Die ersten Pos1 - Vorkommen der zu findenden Zeichenkette ignorieren


    Meine Liste (bzw. der Buffer) sieht beispielsweise wie folgt aus:

    337;281;267;694;60;441;450;18;-13;750;200;0;

    Ich möchte nun jeden einzelnen Wert dieser Liste einer speziellen Variablen zuweisen. Hier einmal der Code für die ersten beiden Werte der CSV Liste:

    [highlight=epc]
    if change(Buffer) then \\
    /* Parsen des 1. Wertes */; \\
    StartPos=0u16; \\
    EndPos=find(Buffer,$;$,0u16)-1u16; \\
    Wert1=split(Buffer,StartPos,EndPos); \\
    /* Parsen des 2. Wertes */; \\
    StartPos=EndPos+2u16; \\
    EndPos=find(Buffer,$;$,StartPos); \\
    Wert2=split(Buffer,StartPos,EndPos); \\
    endif
    [/highlight]

    Das Ergebnis für den 1.Wert ist erwartungsgemäß 337.
    Das Ergebnis für den 2.Wert ist jedoch 281;267;694;


    Parallel zu der o.g. Programmierung habe ich einmal mit einem Beispiel versucht den Pos 1 Parameter der find Funktion zu verstehen.

    Liste=$0123456789abcdefghijklmnopqrstuvwxyz$

    Start1=find(Liste,$abc$,0u16)+size($abc$)
    Ende1=find(Liste,$f$,0u16)
    Wert1=split(Liste,Start1,Ende1)
    -> Wert1 = abcdef
    -> find Funktion liefert das erwartete Ergebnis


    Start2=find(Liste,$abc$,0u16)
    Ende2=find(Liste,$o$,0u16)
    Wert2=split(Liste,Start2,Ende2)
    -> Wert2 = abcdefghijklmno
    -> find Funktion liefert das erwartete Ergebnis


    Start3=find(Liste,$abc$,0u16)
    Ende3=find(Liste,$o$,2u16)
    Wert3=split(Liste,Start3,Ende3)
    -> Wert3 = abcdefghijklmnopqrstuvwxyz
    -> Ergebnis ist für mich nicht nachvollziehbar


    Start4=find(Liste,$abc$,0u16)
    Ende4=find(Liste,$o$,4u16)
    Wert4=split(Liste,Start4,Ende4)
    -> Wert4 = abcdefghijklmnopqrstuvwxyz
    -> Ergebnis ist für mich nicht nachvollziehbar


    Start5=find(Liste,$abc$,0u16)+size($abc$)
    Ende5=find(Liste,$f$,0u16)
    Wert5=split(Liste,Start5,Ende5)
    -> Wert4 = def
    -> find Funktion liefert das erwartete Ergebnis


    Wo liegt hier der Hase im Pfeffer?

    Viele Grüße

    Michael

    #2
    Hi Michael,

    find (String1, String2, Pos1)

    Pos1: Die ersten Pos1 - Vorkommen der zu findenden Zeichenkette
    ignorieren

    Die ersten Pos1 (=Anzahl der) Vorkommen überspringen.

    Also theoretisch müßte aus Deinem Buffer

    Liste=$337;281;267;694;60;441;450;18;-13;750;200;0;$

    ein x=find(Liste,$,$,3u16)
    für x dann 14 ergeben.

    ein y=find(Liste,$;$,4u16)
    für y dann 17.
    Ohne das ausprobiert zu haben...

    Gruß,
    Bernd

    Kommentar


      #3
      Hallo Bernd,

      ich stehe auf dem Schlauch...

      Wie kommst Du in Deinen Beispielen auf die 14 bzw. 17?
      Diese Werte existieren doch in der Liste überhaupt nicht.

      Liste=$337;281;267;694;60;441;450;18;-13;750;200;0;$

      Ich hätte erwartet, dass ich mit Pos1 den Startpunkt der Suche nach String 2 verschieben kann

      Viele Grüße

      Michael

      Kommentar


        #4
        Zitat von Jambala Beitrag anzeigen
        Ich hätte erwartet, dass ich mit Pos1 den Startpunkt der Suche nach String 2 verschieben kann
        Lt. Handbuch: "Pos1: Die ersten Pos1 - Vorkommen der zu findenden Zeichenkette ignorieren".
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          Hallo Michael,

          wie habe ich dann Deinen Code Vorschlag für das Wärmepumpen Gateway zu verstehen (find(Buffer1,$;$,PosStart+1u16))?

          [highlight=epc]
          PosStart=0u16
          PosEnd=0u16
          Wert=$$
          if change(Buffer1) then {
          PosStart=find(Buffer1,$;$,0u16);
          PosEnd=find(Buffer1,$;$,PosStart+1u16);
          Wert=split(Buffer1,PosStart,PosEnd);
          [/highlight]

          Viele Grüße

          Michael

          Kommentar


            #6
            Zitat von Jambala Beitrag anzeigen
            Start3=find(Liste,$abc$,0u16)
            Ende3=find(Liste,$o$,2u16)
            Wert3=split(Liste,Start3,Ende3)
            -> Wert3 = abcdefghijklmnopqrstuvwxyz
            -> Ergebnis ist für mich nicht nachvollziehbar
            Weiß nicht,ob die Frage noch aktuell ist, aber für mich ist das Ergebnis nachvollziehbar, da der Find in der Ende3 nach einem Ergebnis sucht, bei dem 3mal "o" im String auftaucht. "o" gibt es ja aber nur einmal, also EOL.
            Bei der Ermittlung von Wert3 endet damit der Split bei EOL.
            Oder habe ich Dein Problem falsch verstanden? Welches Ergebnis hättest Du erwartet?

            Zu Deiner letzten Frage "PosEnd=(find(Buffer1,$;$,PosStart+1u16))":
            Das +1u16 heißt m.E. nix anderes, als das das Ende der nächste ";" nach der Startposition ist.

            Kommentar


              #7
              Hallo Sandman,

              ich habe bei der find Funktion einfach ein a) grundsätzliches Verständnisproblem und b) ein praktisches Anwendungsproblem.

              zu a)
              Nach Deiner Beschreibung wird bei find(Liste,$o$,2u16) nach 3x $o$ gesucht und falls dies nicht gefunden stoppt der Prozess bei EOL.

              Des weiteren soll find(Buffer1,$;$,PosStart+1u16) dazu führen, dass das nächste $;$ nach der Startposition gesucht wird.

              Damit hätte der find Parameter Pos1 einmal einen Multiplikator-Effekt (1.Beispiel) und einmal einen Positionierungseffekt (2.Beispiel).

              Dies ist der Punkt, den ich nicht verstehe.

              zu b)
              In dem ursprünglichen Beispiel am Beginn meines Threads liefert find(Buffer1,$;$,PosStart+1u16) den Wert $281;267;694;$.

              Hier hätte ich $281$ erwartet, weil das Semikolon nach 281 das erste nach der Startposition ist.

              Viele Grüße

              Michael

              Kommentar


                #8
                Zitat von Jambala Beitrag anzeigen
                Damit hätte der find Parameter Pos1 einmal einen Multiplikator-Effekt (1.Beispiel) und einmal einen Positionierungseffekt (2.Beispiel).
                Ja, wobei eben Pos1 in den Beispeilen einmal das 2. und einmal das 3. Argument von find ist. Das macht halt den Unterschied in der Wirkung aus.
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Hallo Zusammen,

                  ok jetzt habe ich die Funktion Dank des Hinweises von Sandmann und etwas probieren verstanden.

                  find (String1, String2, Pos1)

                  Das Pos1 gibt an welches Vielfaches von String2 gesucht werden soll. Pos1 ist somit keine Bezeichnung eines absoluten Startpunktes (die Bezeichnung Pos wie Position ist hier nicht wirklich glücklich).

                  Somit macht die Funktion find(Buffer1,$;$,PosStart+1u16) zur CSV Werte-Separation keinen Sinn, da PosStart+1u16 letztendlich auch nur eine Vorgabe für ein Vielfaches von $;$ ist.

                  Das folgende Beispiel zeigt die Funktion am Besten:

                  Liste=$100;200;300;400;500;$

                  x1=split(Liste,0u16,find(Liste,$;$,0u16)-1u16) -> ergibt 100
                  x2=split(Liste,(find(Liste,$;$,0u16)+1u16),find(Li ste,$;$,1u16)-1u16) -> ergibt 200
                  x3=split(Liste,(find(Liste,$;$,1u16)+1u16),find(Li ste,$;$,2u16)-1u16) -> ergibt 300
                  x4=split(Liste,(find(Liste,$;$,2u16)+1u16),find(Li ste,$;$,3u16)-1u16) -> ergibt 400
                  x5=split(Liste,(find(Liste,$;$,3u16)+1u16),find(Li ste,$;$,4u16)-1u16) -> ergibt 500

                  Aus meiner Sicht macht es Sinn das Handbuch an dieser Stelle zu schärfen und mit einem Beispiel zu erweitern.

                  Gerne mache ich dazu auch einen Vorschlag, sofern gewünscht.

                  Viele Grüße und vielen Dank an Alle

                  Michael

                  PS: Jetzt kann ich doch noch im alten Jahr den bei mir einsetzenden Wahnsinn loswerden ...

                  Kommentar


                    #10
                    Freut mich zu hören und ja ich stimme Dir zu, daß die Doku bzgl. der Beschreibung m.E. nicht wirklich optimal ist. Bin ebenfalls schon fast an dem Thema mit split und find verzweifelt..... Ähnlich wie an den mich immer wieder einholenden STOPs aufgrund von fehlenden oder falschen Converts.... Hier würde ich mir tw. auch eine bessere Erklärung wünschen....

                    Was mich umgekehrt interessieren würde ist, was Du wie als CSV einliest. Monitorinfos?

                    Ich such noch nach einer Möglichkeit, wie ich z.B. Geburtstage irgendwo nicht statisch im Code z.B. als CSV speichern kann, um diese dann periodisch auszulesen. Und umgekehrt suche ich v.a. für mein EKEY-Makro noch eine Art logging in CSV... Aber das soll aktuell (noch) nicht möglich sein...
                    VG, Oliver

                    Kommentar


                      #11
                      Hallo Oliver,

                      ich lese das RS232 Interface meiner Wärmepumpe aus um die Kennwerte so auf den Bus zu holen. Die Daten liegen dort in CSV Form vor.

                      Du kannst sicherlich auch irgendwelche anderen Daten manuell in einem 1400er Text-Buffer ablegen und dann von dort auslesen.

                      Vielleicht ist dies ja bald auch per FTP möglich (BMX hat da etwas in der Pipe). Das wäre natürlich ideal, eine CSV Liste auf einem WLAN Router liegen zu haben und dann automatisch per FTP immer die aktuelle Version in den EibPC zu laden.

                      Falls Du Hilfe zu CSV-Seperation benötigst, melde Dich, ich habe jetzt fast zwei Tage nichts anderes gemacht.

                      Viele Grüße

                      Michael

                      Kommentar


                        #12
                        Hallo Michael,

                        danke für das schnelle Feedback. 1400er Buffer bedeutet einlesen über eine 1400-Text GA? Da würde ich gerne auf Dich zurückkommen. Hab im Moment noch ein paar andere Baustellen mit PRIO, melde mich aber bei Dir gerne wieder.
                        Viele Grüße und weiter ein gutes Gelingen!
                        Oliver

                        Kommentar


                          #13
                          Zitat von Jambala Beitrag anzeigen
                          Du kannst sicherlich auch irgendwelche anderen Daten manuell in einem 1400er Text-Buffer ablegen und dann von dort auslesen.
                          Dazu mal sich die Funktionen stringcast und stringset anschauen.
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #14
                            OK, aber das bedeutet ja eben, daß die Daten über den Bus bzw. GA's zur Verabreitung in den EIBPC reinkommen. File- oder FTP-Downloadschnittstelle ist (noch) nicht. Da würde mir dann spontan ja nur noch UDP einfallen. In diese Richtung wollte ich schon mal vorstoßen, habe ich dann aber hinten angestellt.... Oder sehe ich den Wald vor lauter Bäumen nicht?
                            Also, mein PRIO G Beispiel:
                            In der Visu würde ich gerne ein Reminderfenster implementieren, dass die aktuellen Geburtstage, Termine, whatever darstellt... (was halt so auf 2 Zeilen geht). Wie bekomme ich diese Daten (also Bezeichnungsfeld und Datum) in den EIBPC zur weiteren Verarbeitung?

                            Diese Daten will ich aber eben nicht statisch im Code hinterlegen... (mein WAF kippt da ganz schnell, wenn ich mal wieder nen Prog.-Upload fahre und dann die PM's für die Zeit nicht gehen oder aber die Rollo-Flags wieder resettet werden (ich weiß, kann man ja auch im Flash abspeichern, aber das ist die PRIO2 Baustelle) usw.
                            Viele Grüße,
                            Oliver

                            Kommentar


                              #15
                              FTP Client für EibPC

                              Zitat von Sandman60 Beitrag anzeigen
                              OK, aber das bedeutet ja eben, daß die Daten über den Bus bzw. GA's zur Verabreitung in den EIBPC reinkommen. File- oder FTP-Downloadschnittstelle ist (noch) nicht.
                              Jein. Ich habe Enertex mal den Code für FTP geschickt. Bisher geht das Senden eines Buffers per FTP an einen Filezilla-Server. Das Lesen einer Datei sollte auch bald gehen. Da warte ich aber mal das fachkundige Urteil der Maestri enertexii ab

                              Da würde mir dann spontan ja nur noch UDP einfallen. In diese Richtung wollte ich schon mal vorstoßen, habe ich dann aber hinten angestellt
                              Per UDP geht natürlich im Zusammenhang mit netcat (nc) was aus dem EibPC raus. Da könnte ich Dir eine Debuglibrary anbieten.BMXDebug2.lib.txt

                              In der Visu würde ich gerne ein Reminderfenster implementieren, dass die aktuellen Geburtstage, Termine, whatever darstellt... (was halt so auf 2 Zeilen geht). Wie bekomme ich diese Daten (also Bezeichnungsfeld und Datum) in den EIBPC zur weiteren Verarbeitung?
                              Zum einen bald sicher per FTP vom Server. Zum anderen wäre es natürlich schön, wenn in der nächsten Implementationsrunde dann eine richtige Textbox kommt. Da warten wir mal Enertex ab.

                              Ich habe eigentlich die Hoffnung, das ich mit dem FTP und einem Makro, was Variablen besonders behandelt folgendes erreichen kann:

                              Beispiel Makro:
                              // RemanentVariable( MyVarname, Vartype, untere Grenze, obere Grenze, Defaultwert, Valid )
                              Eine Variable z.B. KomfortTemperaturSchlafzimmer mit Typ f16 in den Grenzen von 16f16 bis 25f16, Vorgabewert 18.5f16 wird dann über ein Makro wie oben definiert.

                              Dann kann man nach dem Systemstart so etwas in einem Textbuffer anlegen wie: $KomfortTemperaturSchlafzimmer=18.5f16<CRLF>$
                              Zunächst kann das im Flash abgelegt werden in einem String. Damit entfällt das umständliche Handling unter welcher Nummer habe ich jetzt was abgelegt? Es wird einfach gezählt und gut.
                              Weiterhin kann ich diese Informationen aus dem Flash auslesen und per FTP sichern.
                              Natürlich kann ich diese Informationen auch vom FTP wieder einlesen (z.B. wenn ich einen neuen EibPC habe und der Flash da noch nicht stimmt.)

                              Ich kann dann über FTP natürlich auch solche Dinge wie Müllabfuhr etc. einlesen, das könnte man ähnlich wie eine Win.Ini aufbauen oder eine EPC-Datei

                              [Variablen]
                              KomfortTemperaturSchlafzimmer=18.5f16<CRLF>

                              [Termine]
                              ....

                              Und so weiter. Es wäre natürlich schön, wenn da die Makros zentral von Enertex kämen, damit nicht jeder sein eigenes Süppchen kocht.

                              Gruß,
                              Bernd

                              Kommentar

                              Lädt...
                              X