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
-
Hallo RJ,
die Logik verstehe ich leider nicht. Wie soll dann 12.11.1989 aussehen?Leo
-
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")
-
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.
-
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
-
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 -
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 -
Vergiss es: Habe nicht zu Ende gelesen.
-
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 -
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 -
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 -
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 -
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");
-
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.
-
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
Content aside
- vor 2 JahrenZuletzt aktiv
- 25Antworten
- 149Ansichten
-
4
Folge bereits