Trick 73: Datumsverdruß
Unbrauchbare Datumsangaben standardisieren
Immer mal wieder kommt Mißmut auf über unstandardgemäße Datumsangaben!
Da steht in einem Feld sowas wie 3.10.98 oder 10-03-01, man braucht
aber 19981003 bzw. 20010310.
Die schlechte Nachricht: Man kann kein Programm schreiben, das _jede_
Form von Datum standardisieren könnte. Denn es ist ja auch möglich,
daß 10-03-01 in Wahrheit 20100301 bedeutet! Oder daß 04/09/2009
amerikanisch gemeint ist und 20090409 heißen soll.
Wenn es aber so ist, daß die Datumsangaben alle von derselben Struktur
sind, also etwa TT.MM.JJJJ, dann läßt sich was machen. Es gibt ein
allgemeines Rezept, das man für andere Fälle leicht modifizieren kann:
Sagen wir mal, die konkrete Aufgabe lautet so:
In #999 steht immer etwas von der Struktur TT.MM.JJJJ, und
es soll daraus eine #99n werden mit JJJJMMTT. Und als Besonderheit
kann TT bzw. MM auch einstellig sein, also z.B. 1.2.1999.
Hinter dem Datum könnte auch noch etwas stehen, was dann verschwinden
soll.
Die #999 soll dann weg. Die Umwandlung soll auf die gesamte Datenbank
angewendet werden.
Hier der komplette FLEX:
first #
:loop
Die Zahlen umordnen, 1stellige nach rechts ruecken
var #999(b"." b"." e" " 0,r4) #999(b"." e"." 0,r2) #999(e"." 0,r2)
Leerzeichen durch 0 ersetzen, Ergebnis nach #99n
ins _ _0_
ins #99n
und weg mit der #999, Satz speichern
#999
put
:weiter
next #
if cancel jump ende
geloeschte Saetze nicht behandeln!
if del jump weiter
if yes jump loop
:ende
mes Uff, erledigt!
Die Zeile mit "var" ist diejenige, die aus dem vorgegebenen Datum die
richtige Struktur macht. Diese muß man bei einer anderen Vorgabe dann
entsprechend ändern, u.U. wird's schwieriger als in diesem Fall!
Der Trick liegt hier in dem Manipulationsbefehl 0,r2, der bei den
Zahlen für Monat und Tag angewendet wird. Damit rückt man eine
einstellige Zahl nach rechts, so daß sich zwei Stellen ergeben.
Leider ist die erste dann ein Leerzeichen. Man erhält also aus
1.2.1998 dann 1998 2 1. Hm, was nun?
Der zweite Trick ist der Befehl ins _ _0_, der die Leerzeichen im
iV-Text durch Nullen ersetzt. Und das war's dann.
Der Rest ist die normale Vorgehensweise, wenn man die Gesamtbank
durcharbeiten will. (S. Beisp. 3 in der Doku zu next: h xnext)
Tip: Das "put" weglassen, wenn man nach dem Durchlauf erst nochmal
schauen will, ob's denn gut geklappt hat. Danach dann in dem Memü
"Datei" die Funktion "Alle bearb. Daten speichern" aktivieren.
Ist statt der Gesamtbank nur eine Erg.Menge abzuarbeiten, läßt man
das Zeichen # bei first und next weg.
Hinweis:
Ab V29.6 gibt es den Manipulationsbefehl rN,x
Dieser rückt den iV-Inhalt auf N Stellen nach rechts zurecht und füllt
links den Leerraum mit dem Zeichen x auf. Damit könnte man den
var-Befehl des FLEXes so schreiben:
var #999(b"." b"." e" " r4,0) #999(b"." e"." r2,0) #999(e"." r2,0)
Dies entspricht dem r-Befehl der Export-Manipulationssprache.