Datumsparser

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
samyboy
User
Beiträge: 9
Registriert: Sonntag 19. August 2007, 18:59

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

und das `datetime` Modul?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Wir sehen uns dann am 37.17.-723543, nech?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@audax:

Und wo es deine Lösung jetzt einfacher als Gerolds mit ein paar zusäztlichen Abfragen?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Öhm....ja.

Aber das ist Geschmackssache. Ich erfinde nur ungern das Rad neu.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Granino
User
Beiträge: 19
Registriert: Freitag 10. August 2007, 15:40

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
BlackJack

Ich sehe jetzt nicht ganz, wie man bei so etwas "flachem" wie einem Datum "rekursiven Abstieg" braucht!?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten