Seite 1 von 1

Datumsparser

Verfasst: Donnerstag 6. März 2008, 23:54
von samyboy
hallo ich würde einen Datumsparser der mir einem Datumsstring auf einem Handy parst brauchen normalerweise würde das ja mit der strptime funktion im time modul funktioniern aber komischerweise ist diese funktion auf s60 handies nicht vorhanden. Hat jemand eine idee oder hat jemand einen datumsparser der auf dem handy läuft?
eine andere möglichkeit wären auch regular expressions aber damit kenn ich mich nicht so aus.
mfg samy

Verfasst: Freitag 7. März 2008, 00:21
von audax
und das `datetime` Modul?

Re: Datumsparser

Verfasst: Freitag 7. März 2008, 08:00
von gerold
samyboy hat geschrieben:hallo ich würde einen Datumsparser der mir einem Datumsstring auf einem Handy parst brauchen
Hallo samy!

Code: Alles auswählen

#v01:
date = "18.08.1974"
day, month, year = [ int(item) for item in date.split(".") ]

#v02
date = "18.08.1974"
day = int(date[0:2])
month = int(date[3:5])
year = int(date[6:10])
mfg
Gerold
:-)

Verfasst: Freitag 7. März 2008, 12:12
von audax
Wir sehen uns dann am 37.17.-723543, nech?

Verfasst: Freitag 7. März 2008, 12:35
von gerold
audax hat geschrieben:Wir sehen uns dann am 37.17.-723543, nech?
Bleib auf dem Boden! Wenn jemand so einen String in sein Handy eingibt, dann wirft man einen Fehler und fertig.

mfg
Gerold

Verfasst: Freitag 7. März 2008, 14:07
von Leonidas
Was ja dann kompliziert wird. Das Format zu parsen ist ja einfach, nur dann sicherzustellen, dass das auch sinnvoll ist ist komplizierter. 29 Februar ist manchmal richtig, 30. immer falsch.

Dafür gibt es ja Parser. Keine Ahnung warum Nokia beim S60 alles brauchbare weggeworfen hat.

Verfasst: Freitag 7. März 2008, 15:01
von audax
Alternativ:
Das cpan-Modul für Perl Regexp::Common installieren, die RegExp fürs Datum ausgeben lassen und die in Python benutzen.

Regexp::Common ist unglaublich toll. :D
http://search.cpan.org/perldoc?Regexp::Common
http://search.cpan.org/perldoc?Regexp::Common::time

Verfasst: Freitag 7. März 2008, 15:10
von audax
Quasi sowas hier:

Code: Alles auswählen

(?:(?:(?:(?=[0123])(?:0[1-9]|[12]\d|3[01])))(?=(?>/(?:(?=[01])(?:0[1-9]|1[012]))/|-(?:(?=[01])(?:0[1-9]|1[012]))-|\x20(?:(?=[01])(?:0[1-9]|1[012]))\x20|\.(?:(?=[01])(?:0[1-9]|1[012]))\.|(?:(?=[01])(?:0[1-9]|1[012]))(?![-/.\x20])))[-/.\x20]?(?:(?:(?=[01])(?:0[1-9]|1[012])))[-/.\x20]?(?:\d{4}))
Das ist erzeugt mit $RE{time}{d2m2y4}, erkennt also "DD.MM.YYYY'.
Muss allerdings noch endvalidiert werden, aber fängt schonmal die gröbsten Fehler ab :D

Verfasst: Freitag 7. März 2008, 15:32
von EyDu
@audax:

Und wo es deine Lösung jetzt einfacher als Gerolds mit ein paar zusäztlichen Abfragen?

Verfasst: Freitag 7. März 2008, 15:36
von audax
Öhm....ja.

Aber das ist Geschmackssache. Ich erfinde nur ungern das Rad neu.

Verfasst: Freitag 7. März 2008, 16:06
von gerold
Leonidas hat geschrieben:Keine Ahnung warum Nokia beim S60 alles brauchbare weggeworfen hat.
Hallo Leonidas!

Vielleicht deshalb http://www.python.org/doc/2.2/lib/module-time.html
strptime(string[, format])...
Note: This function relies entirely on the underlying platform's C library for the date parsing, and some of these libraries are buggy. There's nothing to be done about this short of a new, portable implementation of strptime().

Availability: Most modern Unix systems.
Ich denke mal, dass nicht das ganze time-Modul nicht existiert, sonder nur diese eine Funktion nicht. Das bedeutet, dass man einen Fehler beim Übergeben der Werte an die Datumsfunktion abfangen kann. Und das meite ich mit "Es genügt wenn man den Fehler abfängt".

Aber leider ist ``time.mktime`` ziemlich bescheuert. Das hier löst keinen Fehler aus:

Code: Alles auswählen

time.mktime((2007, 2, 30, 0, 0, 0, 0, 0, 0))
Also doch nicht so gut die Idee... :?

mfg
Gerold
:-)

Verfasst: Freitag 7. März 2008, 20:47
von Granino
Hallo,
ich möchte mal wieder für den 'rekursiven Abstieg' werben. Hier ist zwar keine Rekursion nötig, aber die Anwendung des Prinzips.
Vorteil: Der unbedarfte Anwender erhält bei fehlerhafter Eingabe die genaue Angabe, was er falsch gemacht hat oder auch eine Warnung, wenn beispielsweise die Jahreszahl extraordinär klein/groß ist.
Nachteil: Vielleicht etwas langer Code, da man alle möglichen Fehleingaben deuten muss.
Gruß Granino

Verfasst: Freitag 7. März 2008, 21:00
von BlackJack
Ich sehe jetzt nicht ganz, wie man bei so etwas "flachem" wie einem Datum "rekursiven Abstieg" braucht!?

Verfasst: Samstag 8. März 2008, 17:35
von birkenfeld
gerold hat geschrieben: Aber leider ist ``time.mktime`` ziemlich bescheuert. Das hier löst keinen Fehler aus:

Code: Alles auswählen

time.mktime((2007, 2, 30, 0, 0, 0, 0, 0, 0))
Das ist schon richtig so. Es ist nämlich ziemlich praktisch, dass ich so z.B.

Code: Alles auswählen

x = mktime((year, month, day + 2, 0, 0, 0, 0, 0, 0))
aufrufen kann, ohne mir über Monats- oder Jahresgrenzen Gedanken machen zu müssen.

Verfasst: Samstag 8. März 2008, 19:04
von gerold
birkenfeld hat geschrieben:Das ist schon richtig so. Es ist nämlich ziemlich praktisch, dass ich so z.B. ... aufrufen kann, ohne mir über Monats- oder Jahresgrenzen Gedanken machen zu müssen.
Hallo birkenfeld!

Das dachte ich mir schon. Aber in dieser speziellen Situation (da es im Python 2.2 noch kein ``datetime`` gibt), wäre es idealer gewesen, wenn ein Fehler ausgelöst worden wäre. ;-) Deshalb das "ziemlich bescheuert" -- im Affekt. :roll:

lg
Gerold
:-)