0

Textabschnitt aus Text extrahieren

Hallo alle Zusammen,

ich komm leider nicht weiter.

ich hab folgenden Text:

 und möchte den rotmarkierten Abschnitt extrahieren.

Hat jemand eine Idee? 

mit der funktion extractx() konnt ich leider nichts anfangen.

 

Viele Grüße  und besten dank im voraus!

Martin

6 Antworten

null
    • Pro BoutiquenFonds GmbH
    • Eichelfr
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Guten Morgen Martin, 

    das sieht nach einem JSON-File aus. Da gibt es in ninox Funktionen, die du zur Verarbeitung nutzen kannst. Schau dir mal das Handbuch hierzu an. Du kannst über die Feldnamen: startDate und  endDate; auf die Felder zugreifen und diese in einer Tabelle die Einträge zuordnen.

    Frank

    • Martin_Wackenhut
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Hi Frank, 

    vielen Dank für deine Antwort.

    Ich arbeite mich mal durch :)

    • T_Bartzsch
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Hi Martin, mit RegEX und somit auch mit extractx kommst Du da zur Not auch weiter.

    Wie Martin aber schon schrieb, ist  das ein JSON Response... wenn Du den ganzen String mal postest, kann man da mehr zu sagen. Generell navigiert man durch einen JSON mit der sog. Punkt-Navigation. D.h. du füllst eine Variable mit dem JSON Inhalt durch 

    let myJSON := parseJSON(DEIN_JSON_STRING); 

    und kannst dann die einzelnen Werte aus den Keys auslesen: myJSON.id .... oder myJSON.createdTime

    und so kannst du auch andere Felder befüllen:

    Datum := text(myJSON.startDate)

    • Martin_Wackenhut
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Hi Bartzsch,

    Vielen Dank für deine Hilfe 🙏

    Ich hab es mittlerweile gelöst bekommen. Zwar etwas aufwendig und nicht sehr elegant aber das Ergebnis passt .

    Weist du ob es zu der Funktion extractx irgendwo eine Anleitung oder eine ausführlichere Erklärung gibt? Ich bin aus der Dokumentation in Ninox nicht so wirklich schlau geworden 😅

    hier noch der Code wie ich es gelöst hab. 

    let myJson := response.result;
        let gesamtanzahl := cnt(myJson);
        let zaehler := 0;
        let schleife := true;
        "Schleife-----------------------------------------------------------------------------------------------------------------------------------------------------";
        while schleife = true do 
            for i in myJson do
                let Kalender := text(item(myJson, zaehler).subCalendars);
                if Kalender like Filter then
                    let neu := (create 'KalenderDigital API');
                    let arbeiter := first(select Mitarbeiter);
                    neu.(Mitarbeiter := arbeiter);
                    neu.(ID := item(myJson, zaehler).id);
                    neu.(von := item(myJson, zaehler).startDate);
                    neu.(bis := item(myJson, zaehler).endDate);
                    neu.(subcalendar := Kalender);
                    zaehler := zaehler + 1
                else
                    zaehler := zaehler + 1
                end;
                "Schleife Beenden---------------------------------------------------------------------------------------------------------------------------------------------";
                if zaehler >= gesamtanzahl then
                    schleife := false;
                    zaehler := 0
                end
            end
        end

    end

    Viele Grüße Martin 

    • T_Bartzsch
    • vor 7 Monaten
    • Gemeldet - anzeigen

    Na, wenn es am Ende funktioniert, dann ist´s doch gut...

    Holst du das JSON denn imScript direkt in die Variable ab? Also zb:
    let response := http("POST","https://deineAPIanfrage") usw... ?

    Prinzipiell musst du dein JSON aber nicht als Array behandeln, sondern du kannst die einzelnen Keys direkt ansprechen. In deinem Fall ist die JSON Antwort ja in response.result - und dort gibt dir dann zB.  "response.result.id" den Wert "452239149" zurück. Den Typ musst du bei JSON allerdings besser mit angeben... wenn du also dein Zahlenfeld "ID" mit dem Wert aus der JSON-Antwort befüllen möchtest, dann würde das so aussehen:

    ID := number(response.result.id);

    Jetzt kann es in der JSON-Antwort auch Arrays geben. "subCalendars" besteht aus einem Array ... ["Walter","Verfügbarkeiten"]. Da würde Dir response.result.subCalendars nicht weiterhelfen, da kann man dann über die "items", oder über Schleifen durchiterieren:

    response.result.item(subCalendars,0) gibt Dir dann "Walter" zurück ... oder

    for i in response.result.subCalendars do .... usw.

    Thema RegEX:

    www.regex101.com nutze ich gerne zum Testen. Dort kannst du deinen regulären Ausdruck zusammensetzen und siehst unten im Text sofort das Ergebnis. Was mir in Ninox sehr weitergeholfen hat, ist die Möglichkeit, Gruppen anzusprechen. D.h. ich suche nach einem gleichen Muster im String, gefolgt von meinem Wert den ich auslesen möchte, und mache daraus 2 Gruppen, oder 3, wenn ich das Ende meiner Suche auch noch eingrenzen kann/möchte. In Ninox lese ich mir dann die Gruppe mit dem Wert aus den ich brauche. In deinem Beispiel oben:

    Du hast den eindeutigen Key  "startDate", du hast dein Datum, du hast Anführungsstriche

    ein regEx ("startDate":")(.*)(") würde folgendes machen: 

    suche den String "startDate":" gefolgt von allen anderen Zeichen .*, gefolgt von einem " - und setze die drei Ergebnisse in eine Gruppe (runde Klammern). Du willst später an die mittlere Gruppe 2 und um die Suche so eindeutig wie möglich zu machen, suchst du Teile VOR und NACH deinem gesuchten String.

    Mit extractx(DEINTEXT,"REGEX","$GRUPPE") könntest Du nun an das Datum kommen (wichtig: RegEx und Gruppe müssen in Anführungszeichen)

    Datum := extractx(DEINTEXT, "("startDate":")(.*)(") ","$2")

    Du kannst mit RegEx nach eindeutigen Strings suchen ... zB. "startDate", man kann nach Buchstaben (\w), nach Zahlen (\d), nach allen Kleinbuchstaben ([az]), allen Großbuchstaben ([AZ]), Satz-und Leerzeichen (\s), allen Zeichen (.)  suchen und die Anzahl der gesuchten definieren: \d? (keine oder eine Zahl) , \d+ (mindestens eine und alle folgenden Zahlen), \d* (keine oder alle folgenden Zahlen)

    Reg Ex braucht etwas Phantasie, aber mit der genannten Webseite kann man das gut ausprobieren... 

      • Martin_Wackenhut
      • vor 7 Monaten
      • Gemeldet - anzeigen

       

      Erstmal vielen Dank für deine ausführliche Erklärung. 🙏

      Ich muss gestehen das ich kompletter Leihe bin bei solchen Themen und mich da immer mit Hilfe des Forums und der Dokumentation von Ninox irgendwie durcharbeite. 
      Ohne die tolle Community wär ich komplett verloren. Das liebe ich an Ninox sehr.

      Jetzt zu deiner ersten Frage:

      Genau so ist es !

      
          let response := do as server
                  http(myMethod, myURL + myURLzusatz + Start + myURLzusatzZwei + Ende + myURLzusatzDrei, myHeaders, myBody)
              end;
      

      Das ich die einzelnen Keys direkt so ansprechen kann war mir leider nicht bekannt! Im nachhinein hät es soviel einfacher sein können 😅 

      Und nochmal danke für deine ausführliche Erklärung zum Thema Regex. Das hilft mir für dein Einstieg sehr!  

      Beste Grüße 

      Martin :)

Content aside

  • Status Answered
  • vor 7 MonatenZuletzt aktiv
  • 6Antworten
  • 127Ansichten
  • 3 Folge bereits