0

Datums-Zahlen aufsplitten und sortieren

Hallo

 

Ist es Möglich ein Datum aufzusplitten und zu sortieren?

Heisst zb: 03.10.1989

Was ich gerne angezeigt bezäme wäre: 13890

 

Die 1900 soll nicht aufgelistet werden

Die 0 der 10 zu hinterst

die 0 der 03 nicht ersichtlich

 

Ist sowas möglich 

Danke und Gruss

25 Antworten

null
    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo RJ,
    die Logik verstehe ich leider nicht. Wie soll dann 12.11.1989 aussehen?

    Leo

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Leonid Semik 

      Hallo Leo und danke für die Rückfrage

      Die Logik ist so auch nicht wirklich ersichtlich.

      Ich arbeite Numerologisch und möchte gerne aus dem Geburtsdatum einen Zahlencode generieren.

      Heisst: Dein Rückfragedatum 12.11.1989 bräuchte ich als 111289 angezeigt (19 vom Jahrtausend, nicht)

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi RJ. Versuche mal das. Gruß Mirko

    let myDate := text(DATUMFELD);
    let first := extractx(item(split(myDate, "."), 1), "[1-9]{1,2}");
    let third := extractx(myDate, "\d{2}(?=$)");
    let second := extractx(myDate, "[1-9]{1,2}");
    rpad(first + second + third, 5, "0")
      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      Hallo Mirko

      Herzlichen Dank, das funktioniert schon super...genau das habe ich gesucht!

      Als erstes:

      Schön wäre es, wenn es jetzt noch von klein nach gross sortiert würde....heisst: die kleinste Zahl als erstes und die grösste am Schluss. Ideal würde die 0 (als grösste) als letzte Zahl stehen

      Aber grundsätzlich kann ich schon mit dem wunderbar arbeiten, sollte das sortieren so nicht gehen.

       

      Als zweites:

      Ich versuche den Code zu verstehen, stehe aber bei Zeile 3 und 5 auf dem Schlauch; 

      let third := extractx(myDate, "\d{2}(?=$)");
      rpad(first + second + third, 5, "0")

      Was wird hier gemacht?

      Würde mich über eine kurze Erklärung freuen, damit ichs beim nächsten mal vieleicht selber machen kann. danke

       

      Schönen Tag und Gruss

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi RJ

    Sortieren macht den Code noch etwas schräger, da immer zwischen Zahlen und Zeichen gewechselt werden muss. Ich tappe natürlich auch im Dunkeln, da ich nicht so genau weiß, was das soll und habe nur die beiden Daten so hingedeichselt, dass Dein Ergebnis rauskommt. Jetzt hast Du, je nach Datum, 5- oder 6-stellige Ergebnisse.

    let myDate := text(DATUMFELD);
    let first := extractx(item(split(myDate, "."), 1), "[1-9]{1,2}");
    let third := extractx(myDate, "\d{2}(?=$)");
    let second := extractx(myDate, "[1-9]{1,2}");
    rpad(replace(concat(sort(split(first + second + third, ""))), ", ", ""), 5, "0")

    die Erklärung:

    1. let third... = extrahiere aus dem Text zwei Zahlen \d{2}, denen das Zeilenende (?=$) folgt

    2. mit rpad füllst Du schlicht eine Null am Ende des Textes auf, damit er 5 Zeichen lang ist. Dieser Kniff erschien mir einfacher, als noch eine extractx-Zeile einzufügen. 

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      Hallo Mirko

      Das passt schon ganz gut mit der Sortierung.

      Nur besteht noch ein Problem, bezüglich der 0.

      Aber wenn ich den Code richtig interpretiere, weiss ich gar nicht ob mein Wunsch realisierbar ist.

      Ich weiss das mein Wunsch wohl etwas ausgefallen ist :)

      Ich versuche es mal zu erklären, damit sich die Position der 0, und dessen Sinn, vielleicht etwas zeigt.

       

      Wenn ich ein Geburtsdatum kriege, dann zerlege ich es als erstes in Einzelteile.

      Wichtig für mich sind die Zahlen des Tages, des Monats und des Jahrzehnts.

      Also zb: 13.12.1979 wäre dann der 112379

      Soweit funktioniert das Ganze perfekt

       

      Wenn ich jetzt aber ein Datum mit einem 0 bekomme, davon gibt es 2 Varianten, benötige ich 2 unterschiedliche Ausgaben

       

      Wenn die 0 vor einer Zahl steht, dann ist sie ja nicht da

      Also: 02.02.1977 wäre dann korrekt: 2277

       

      Wenn aber 10.02.1977 da ist, dann wäre es korrekt: 12770 (Ob die 0 zu hinterst steht, oder als erstes, das ist grundsätzlich egal)

       

      Somit können 4, 5 und 6-stellige Zahlen entstehen

       

      Also soll nur die 0 der 10,20,30 usw. angezeigt werden und alle 01.02.03 usw. nicht.

      Ich bin mir bewusst dass dies keine Alltägliche Anfrage ist, aber ich bin schon sehr Happy mit den Inputs die ich bisher gekriegt habe :)

      Ich hoffe es wird verstanden was ich meine. 

      Danke sehr und Gruss

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Steht noch die Frage 10.10.1988: eine oder zwei Nullen? Im Script vorab mit einer Null beantwortet.

    let myDate := text(DATUMFELD);
    let first := extractx(item(split(myDate, "."), 1), "[0-9]{1,2}");
    let third := extractx(myDate, "\d{2}(?=$)");
    let second := extractx(myDate, "[1-9]{1,2}");
    let sauber := first + second + third;
    let result := replace(concat(sort(split(replace(sauber, "0", ""), ""))), ", ", "");
    let lengthResult := length(result);
    if day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30 or month(DATUMFELD) = 10 then
     rpad(result, lengthResult + 1, "0")
    else
       result
    end
      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      Wenn wir den 10.10.1988 nehmen, dann wäre korrekt: 118800

      Wenn es der 10.10.2020 wäre, dann : 112000

      Noch mehr 0 hätte das Datum: 20.10.2000 mit : 120000

      Alle 0 hinter einer Zahl sollen aufgelistet werden und alle 0 vor einer Zahl nicht.

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wenn das Ausgangsatum immer das Format DD.MM.YYYY hat könnte das funktionieren:
    let vDatum := replace(text(Datum), ".", "");
    let Tag := replacex(substr(vDatum, 0, 2), "^0", "");
    let Monat := replacex(substr(vDatum, 2, 2), "^0", "");
    let Jahr := substr(vDatum, 6, 2);
    Tag + Monat + Jahr

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wenn die Jahreszahl auch noch ohne führende 0 angezeigt werden soll:
    let vDatum := replace(text(Datum), ".", "");
    let Tag := replacex(substr(vDatum, 0, 2), "^0", "");
    let Monat := replacex(substr(vDatum, 2, 2), "^0", "");
    let Jahr := replacex(substr(vDatum, 6, 2), "^0", "");
    Tag + Monat + Jahr

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Vergiss es: Habe nicht zu Ende gelesen.

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Mir ist noch nicht verständlich, wie der Aufbau sein soll.
    was soll bei folgenden Daten herauskommen?
    10.10.2009


    10.03.2010 werden dann 2 Nullen am Ende Rangegangen?


    21.10.1980


    15.11.1965

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG 

      Hallo UweG und auch an Dich ein danke für die Unterstützung

       

      10.10.2009 wäre: 1900

      10.03.2010 wäre wie Du richtig nachgefragt hast, zwei 0 dabei: 112300

      21.10.1980 wäre: 112800

      21.10.1980 wäre: 112800

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    noch schräger

    let myDate := text(DATUMFELD);
    let first := extractx(item(split(myDate, "."), 1), "[0-9]{1,2}");
    let third := extractx(myDate, "\d{2}(?=$)");
    let second := extractx(myDate, "[1-9]{1,2}");
    let eins := contains(text(year(DATUMFELD)), "0");
    let zwei := contains(text(year(DATUMFELD)), "00");
    let sauber := first + second + third;
    let result := replace(concat(sort(split(replace(sauber, "0", ""), ""))), ", ", "");
    let lengthResult := length(result);
    let vier := (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 and zwei;
    let drei := (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 and eins;
    let zwei := (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 or (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) or month(DATUMFELD) = 10 and eins;
    let eins := day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30 or month(DATUMFELD) = 10 and not eins and not zwei;
    if vier then
        rpad(result, lengthResult + 4, "0")
    else
        if zwei then
            rpad(result, lengthResult + 2, "0")
        else
            if eins then
                rpad(result, lengthResult + 1, "0")
            else
                if drei then
                    rpad(result, lengthResult + 3, "0")
                else
                    result
                end
            end
        end
    end

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    noch zwei Fehler:

    let myDate := text(DATUMFELD);
    let first := extractx(item(split(myDate, "."), 1), "[0-9]{1,2}");
    let third := extractx(myDate, "\d{2}(?=$)");
    let second := extractx(myDate, "[1-9]{1,2}");
    let eins := contains(text(year(DATUMFELD)), "0");
    let zwei := contains(text(year(DATUMFELD)), "00");
    let sauber := first + second + third;
    let result := replace(concat(sort(split(replace(sauber, "0", ""), ""))), ", ", "");
    let lengthResult := length(result);
    let vier := (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 and zwei;
    let drei := (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 and eins or month(DATUMFELD) = 10 and zwei;
    let zwei := (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 or (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) or month(DATUMFELD) = 10 and eins;
    let eins := day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30 or month(DATUMFELD) = 10 and not eins and not zwei or eins;
    if vier then
        rpad(result, lengthResult + 4, "0")
    else
        if drei then
            rpad(result, lengthResult + 3, "0")
        else
            if zwei then
                rpad(result, lengthResult + 2, "0")
            else
                if eins then
                    rpad(result, lengthResult + 1, "0")
                else
                    result
                end
            end
        end
    end

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      oh..das gibt code :) danke

      spannend ist dass der Code bei 02.02.1077 funktioniert mit der Ausgabe 2277

      Aber bei einigen Daten, zb. dem 10.01.1952 spuckt er eine 0 zuviel aus (MonatsNull) mit 112500

      Auch bei 31.03.2011 zeigt er eine 0 an obwohl diese im Monat nicht ersichtlich sein sollte. (111330)

       

      Wieso beim ersten Datum nicht und bei den anderen teilweise schon?

       

      deinen Code habe ich so eingefügt und das Datumfeld angepasst:

      let myDate := text(Geburtstag);
      let first := extractx(item(split(myDate, "."), 1), "[0-9]{1,2}");
      let third := extractx(myDate, "\d{2}(?=$)");
      let second := extractx(myDate, "[1-9]{1,2}");
      let eins := contains(text(year(Geburtstag)), "0");
      let zwei := contains(text(year(Geburtstag)), "00");
      let sauber := first + second + third;
      let result := replace(concat(sort(split(replace(sauber, "0", ""), ""))), ", ", "");
      let lengthResult := length(result);
      let vier := (day(Geburtstag) = 10 or day(Geburtstag) = 20 or day(Geburtstag) = 30) and month(Geburtstag) = 10 and zwei;
      let drei := (day(Geburtstag) = 10 or day(Geburtstag) = 20 or day(Geburtstag) = 30) and month(Geburtstag) = 10 and eins or month(Geburtstag) = 10 and zwei;
      let zwei := (day(Geburtstag) = 10 or day(Geburtstag) = 20 or day(Geburtstag) = 30) and month(Geburtstag) = 10 or (day(Geburtstag) = 10 or day(Geburtstag) = 20 or day(Geburtstag) = 30) or month(Geburtstag) = 10 and eins;
      let eins := day(Geburtstag) = 10 or day(Geburtstag) = 20 or day(Geburtstag) = 30 or month(Geburtstag) = 10 and not eins and not zwei or eins;
      if vier then
          rpad(result, lengthResult + 4, "0")
      else
          if drei then
              rpad(result, lengthResult + 3, "0")
          else
              if zwei then
                  rpad(result, lengthResult + 2, "0")
              else
                  if eins then
                      rpad(result, lengthResult + 1, "0")
                  else
                      result
                  end
              end
          end
      end

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    anderer Ansatz:

    let myDate := text(DATUMFELD);
    let first := extractx(item(split(myDate, "."), 1), "[0-9]{1,2}");
    let third := extractx(myDate, "\d{2}(?=$)");
    let second := extractx(myDate, "[1-9]{1,2}");
    let eins := contains(third, "0");
    let zwei := contains(third, "00");
    let sauber := first + second + third;
    let result := replace(concat(sort(split(replace(sauber, "0", ""), ""))), ", ", "");
    let lengthResult := length(result);
    let add := 0;
    switch add = 0 do
    case (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 and zwei:
        (add := 4)
    case (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10 and eins:
        (add := 3)
    case (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and zwei:
        (add := 3)
    case month(DATUMFELD) = 10 and zwei:
        (add := 3)
    case (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and month(DATUMFELD) = 10:
        (add := 2)
    case (day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30) and eins:
        (add := 2)
    case month(DATUMFELD) = 10 and eins:
        (add := 2)
    case zwei:
        (add := 2)
    case day(DATUMFELD) = 10 or day(DATUMFELD) = 20 or day(DATUMFELD) = 30:
        (add := 1)
    case month(DATUMFELD) = 10:
        (add := 1)
    case eins:
        (add := 1)
    default:
        0
    end;
    if add != 0 then
        rpad(result, lengthResult + add, "0")
    else
        result
    end

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      Hi Mirko

      Perfekt!

      Das scheint mit allen versuchten Daten zu funktionieren.

      Einziger Schönheitsfehler, aber da bin wohl ich schuld weil mir das vorher nicht aufgefallen ist oder ich es nicht geschrieben habe. Die 0 aus der zB. 1903 wird wohl auch angezeigt. Die sollte nicht da sein. 

       

      Aber sonst passt alles perfekt!

      Ganz herzlichen Dank für deine Hilfe

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi RJ. Ändere doch bitte noch Zeile 5 und 6 durch Einfügen von. Gruß

    let eins := contains(extractx(myDate, "\d(?=$)"), "0");
    let zwei := contains(extractx(myDate, "\d(?=$)"), "00");
    
      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      Ganz herzlichen Dank

      Jetzt ist es perfekt

      liebe Grüsse, Roger

      • mirko3
      • vor 2 Jahren
      • Gemeldet - anzeigen

      RJ 

      let eins := contains(extractx(myDate, "\d{1}(?=$)"), "0");
      let zwei := contains(extractx(myDate, "\d{2}(?=$)"), "00");

      Jetzt ;-), sonst geht 2000 nicht.

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      oh...mit 2000 hab ich nicht geschaut ^^

      Mit deiner Ergänzung hat es aber eine 0 zuviel. 

      Es hat mit der vorgängigen Ergänzung grundsätzlich schon gepasst.

      MZ said:
      let eins := contains(extractx(myDate, "\d(?=$)"), "0");
      let zwei := contains(extractx(myDate, "\d(?=$)"), "00");

       Es zeigt mir zwar bei zb: 30.03.2000 die Zahlenfolge; 3300 an (Obwohl die letzte 0 ja auch nicht nötig wäre, aber damit kann ich wunderbar leben, da es wohl nur bei den 2000er ist.)

      Aber mit dem neuen ist es dann: 33000

       

      OffTopic: Welche Programmiersprache müsste man lernen um selber auf solche Codes zu kommen? 

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Zuerst die Scriptsprache von Ninox natürlich. Sie soll dem Javascript ähneln, was ich nicht beurteilen kann. In unserem Script findest Du ausserdem noch reguläre Ausdrücke (regular expression). Dafür stellt Ninox vier Befehle bereit, in die man dann zur Textanalyse solche Ausdrücke integrieren kann. Sie sind programmiersprachenunabhängig. Ich benutze sie sehr gern, aber an UweGs Beitrag siehst Du, dass es auch weniger kryptische Lösungen gibt. Wenn Du noch nicht Mitglied im Webinar 2022 bist, dann kannst Du Dich beim Support melden und um Einladung bitten. Dort findest du eine Datei mit der Syntax von Ninox 0001_Ninox_Reference und 344_Regex_Tester, letztere mehr zum Einstieg und zum Testen gedacht, erstere ein geniales und mächtiges Werk von zwei Usern mit allen gängigen Befehlen.

      • roger_j
      • vor 2 Jahren
      • Gemeldet - anzeigen

      MZ 

      super...ich danke Dir für alles!

    • rainless
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo zusammen,

    ich finde die Frage programmiertechnisch spannend und RegExpes sowieso. Deshalb habe ich mich auch mal an einer Lösung versucht. Sie ist kompakter, aber unter der Voraussetzung, dass zwei Beispiele in RJs Anforderungen wirklich fehlerhaft sind - sonst habe ich das Prinzip noch nicht verstanden (s. u.). Das Ergebnis meines Codes mit allen Beispielen aus dem Text:

    • 10.10.1988: 118800 -- ok
    • 10.10.2020: 112000 -- ok
    • 20.10.2000: 120000 -- ok
    • 10.10.2009: 1900 -- nein, weil 2x 1 im Datum ist. Richtig wäre m. E. 11900 -- ok
    • 10.03.2010: 112300 -- nein, weil die 20 doch wegfällt. Richtig wäre m. E. 11300 -- ok
    • 21.10.1980: 112800 -- ok
    • 02.02.1077: 2277 -- ok
    • 10.01.1952: 11250 -- ok
    • 31.03.2011: 111330 -- ok

    Und hier der Code:

    let a := format(date(2010, 03, 10), "DMYY");
    if testx(a, "0[1-9]$") then
       a := substring(a, 0, length(a)-2) + substring(a, length(a)-1, length(a))
    end;
    let c := "";
    for i from 0 to length(a) do c := c + substring(a, i, i+1)+" " end;
    let d:= replace(concat(sort(split(c, " "))), ", ", "")
    replace(d, extractx(text(d), "^0*"), "") + extractx(text(d), "^0*");
    

    Ich meine, dass es sogar noch kompakter gehen müsste, wenn RegExp auch mit Backreferences funktionieren würden. Aber entweder ich habe einen Fehler gemacht, oder es geht nicht. 

    Zum Ausprobieren einfach das Datum in der ersten Zeile ersetzen. Im Normalbetrieb kann man dann statt "date(y, m, d)" einfach die Variable mit dem Datum einsetzen.

    Viel Spaß damit