Perl-oder Python-Skript: Konvertiert Datum von dd/mm/yyyy auf yyyy-mm-dd
Ich habe viele Termine in einer Spalte in einer CSV-Datei, die ich konvertieren muss von dd/mm/yyyy auf yyyy-mm-dd format. Zum Beispiel 17/01/2010 umgewandelt werden soll, um 2010-01-17.
Wie kann ich das in Perl oder Python?
Es gibt einen großen Unterschied zwischen der Lösung des Problems für isolierte, gut gebildet ASCII-strings, die mit nichts sonst in Sie, und lösen es für strings, wo immer Sie auftreten, als Termin vermutlich in beliebige text-Dateien — vor allem, wenn es die richtigen Unicode-Daten, nicht nur legacy ASCII.
InformationsquelleAutor FunLovinCoder | 2010-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
oder mehr hackish Weise (die nicht überprüfen Sie die Gültigkeit von Werten):
Das Datum ist ein Feld, das ich extrahieren aus einer CSV-Datensatz. Es ist sonst nichts in dem Feld. Es funktioniert perfekt für meine Bedürfnisse.
Frage ist ganz eindeutig: ich brauche zum konvertieren von
dd/mm/yyyy
zuyyyy-mm-dd
format.Ich bin mit silentghost auf diesen einen...nicht die Probleme lösen, die nicht existieren. Warum davon ausgehen, dass die Daten nicht validiert in seiner ursprünglichen form?
Ich habe das problem gelöst, wie Sie gestellt wurde. Es war nicht wirklich vollständig angegeben werden, also gab ich mehrere Antworten, die zeigen, welche für Sie arbeitete, wo, und welche gescheitert, wo. Ich bemühe mich nicht zu übernehmen, Dinge, die nicht in der ursprünglichen Frage, vor allem, wenn es sich vielleicht als cargo-cult programming. Alle
split()
Lösungen, einschließlich mir, brechen Sie auf Daten in text-Dateien; Sie arbeiten nur auf Einzelfälle, das ist NICHT was die Frage über. Es war vielleicht das, was er wollte, aber er wollte nicht, dass für die Fragen. Damit die vielfältigen Antworten, die mit unterschiedlichen Voraussetzungen und Ansätze.InformationsquelleAutor SilentGhost
Wenn haben Sie garantiert wohlgeformte Daten, die aus nichts anderem als singleton-Datum in der DD-MM-YYYY format, dann funktioniert das:
Dass die arbeiten an einem
$date
holding "07/04/1776", versäumt es aber, auf "das 17/01/2010 und 01/17/2010 es". Verwenden Sie stattdessen:Wenn Sie lieber eine "grammatische" regex, so dass es leichter zu pflegen und zu aktualisieren, Sie können stattdessen diese:
Schließlich, wenn Sie Unicode-Daten, möchten Sie vielleicht, um ein bisschen mehr aufpassen.
Können Sie sehen, wie jede dieser vier Ansätze führt bei der Konfrontation mit dem Beispiel für die Eingabe von Zeichenfolgen wie diese:
Nun lassen
$date
eineforeach
iterator durch das array, erhalten wir diese Ausgabe:Nun nehmen wir an, dass Sie eigentlich tun passen wollen, die nicht-ASCII-Zeichen. Zum Beispiel:
oder sogar
Also stellen Sie sich vor Sie haben einen Termin in mathematical monospace-Ziffern, wie folgt:
Den Perl-code funktioniert nur gut auf, dass:
Ich denke, Sie werden feststellen, dass Python hat eine ziemlich Gehirn‐beschädigt Unicode-Modell, dessen mangelnde Unterstützung für abstrakte Zeichen und Zeichenfolgen unabhängig von Inhalt macht es unglaublich schwierig zu schreiben, Dinge wie diese.
Es ist auch schwer zu schreiben, gut lesbar reguläre Ausdrücke in Python, wo Sie entkoppeln die Erklärung der Teilausdrücke von Ihrer Ausführung, da
(?(DEFINE)...)
Blöcke werden nicht unterstützt es. Heck, Python gar nicht unterstützt Unicode-Eigenschaften. Es ist einfach nicht geeignet für Unicode regex arbeiten, weil dieser.Aber hey, wenn Sie denken, dass ist schlecht in Python im Vergleich zu Perl (und es ist sicherlich), versuchen Sie einfach eine andere Sprache. Ich habe nicht eines gefunden, das nicht noch schlimmer für diese Art von Arbeit.
Wie Sie sehen, laufen Sie in echte Probleme, wenn Sie Fragen, für regex-Lösungen aus mehreren Sprachen. Zunächst die Lösungen sind schwer zu vergleichen wegen der verschiedenen regex-Aromen. Aber auch, weil keine andere Sprache vergleichen können mit dem Perl-für Kraft, Expressivität und Wartbarkeit in seinen regulären Ausdrücken. Dies kann noch deutlicher werden, sobald beliebige Unicode ins Bild.
Also, wenn Sie nur wollte, Python, sollten Sie gebeten haben, nur dass. Ansonsten ist es ein furchtbar unlauteren Wettbewerb, Python fast immer verlieren; es ist einfach zu chaotisch, um Dinge wie diese korrekt in Python, geschweige denn beide richtige und sauber. Dass die Fragen mehr, als es produzieren kann.
Im Gegensatz dazu, Perl-regexes excel auf beiden.
++ für die Bildung Wert.
Sie sind sehr willkommen. Unicode-regexes sind sehr viel in meinem Kopf in diesen Tagen, und ich versuche, die Menschen zu lehren, dass Sie wirklich reinschreiben können regexes, die gleichzeitig portabel, lesbar und wartbar. Ich versuche zu legen, die "regexes sind unergründlich" - Mythos. Natürlich, wenn Sie nicht verwenden können, Kommentare, Leerzeichen, Buchstaben-Kennungen oder zu entkoppeln Ihre Erklärungen Ihrer Ausführung, es ist völlig hoffnungslos. Also Mach das nicht: verwenden Sie alle diese Techniken in regexes, genau wie in jeder anderen Programmiersprache.
Was, kein Strptime - Modul?
Ich Frage mich, ob die Verwendung der
(?(DEFINE)...)
hier eigentlich gar nichts, konnte nicht erreicht werden, indem nur gute ol' interpolation von strings:$slash = qr(/); $start = qr/\A/;
etc., dann interpolieren diese in der substitution statt zu schreiben(?&slash)
etc.InformationsquelleAutor tchrist
Use Time::Piece (in-core, da 5.9.5), sehr ähnlich wie die Python-Lösung akzeptiert, wie es bietet die strptime und strftime Funktionen:
oder
Was mit ungültigen Daten denken Sie da? Die meisten verursachen würde strptime zu werfen ist ein Fehler.
Ja, also, was tun, setzen Sie in Ort, wenn Sie einen Fehler erhalten?
InformationsquelleAutor MkV
Gehen mit Perl: die
datetime
Python-Paket ist einfach gebrochen. Sie konnte nur tun Sie es mit regexes zu tauschen, das Datum Teile um, zBWenn Sie brauchen, um zu analysieren, Daten (Z. B. berechnen Sie den Tag der Woche oder andere Kalender-Typ-Operationen), Blick in DateTimeX::Einfach (Sie können es mit
apt-get
unter Ubuntu):die DateTime-Module sind overkill, Time::Piece ist auf CPAN und hat sich im Kern seit 5.9.5 / 5.10.
InformationsquelleAutor DomQ
Perl :
Dann müssen Sie nur noch laufen:
MyScript.pl
oder die neue Datei.perl -pi -e 's{(\d{2})/(\d{2})/(\d{4})}{$3-$2-$1}g' file.txt
führen eine inline ersetzen.das wird nicht das richtige tun, die auf Zeichenketten wie "123/45/67890"; es wird Ihnen "16789-56-230". Es sollte Sie in Ruhe lassen, denke ich. Müssen Sie einige Grenzen.
Und hier kommen die Grenzen !
InformationsquelleAutor OMG_peanuts
Perl:
einige von uns lieben unsere LTS
Ich muss gestehen, manchmal mit LTS für schöne kleine ASCII-art-Bilder ästhetisch verkleidet als Perl-code. ☺
InformationsquelleAutor Frost.baka
In Perl können Sie tun:
InformationsquelleAutor codaddict
In herrlichen perl-oneliner form:
Aber im ernst ich würde es so machen:
Die Arbeit wird auf einem Rohr, konvertieren und drucken ein Datum pro Zeile ein.
sagt, Sie hat zu arbeiten, für beliebigen text? Nicht die Probleme lösen, die nicht existieren. Die Daten können validiert wurden in das bestehende format. Wir wissen nicht, die eine oder andere Weise, also warum machen Sie keine Annahmen?
In der Tat hat der Autor nicht anderweitig vermerkt, dass beliebige text ist nicht erforderlich, da diese gut bekannt sind text-strings aus einer CSV-Datei. tchrist aus diesem gleichen Kommentar auf ther-code in anderen Ländern, nur als kleine Rechtfertigung.
Das problem Skillung nur erwähnt, dass solche Datums-Zeichenfolge aufgetreten ist, in text-Dateien. Es an keiner Stelle angegeben, dass die strings geändert werden, waren nicht wirklich Auftritt in text-Dateien; es Tat, er sagte Sie waren. Daher Lösungen, die vorgeben, die Saiten bestehen, die in völliger isolation Holen Sie sich alle Arten von Dingen, die falsch ist. Sie kann nicht ding Leute, für die Beantwortung der Frage, die gestellt wurde. Wenn der Fragesteller hatte bisher eher vorsichtig in seiner spec, die Menschen würden nicht gehabt haben, zu erraten.
Ich kann nicht die Schuld Sie für Ihre Antwort, die war extrem präzise und korrekt, aber nicht jeder der weniger präzise Antworten falsch. Sie behaupten, dass die off-hand der Verweis auf die "text files" bedeutet "in beliebiger textströme dass die Daten zunächst ausgewertet und dann umgesetzt" während ich und andere, interpretiert diese Frage richtig als zum umwandeln einer string-Darstellung von Datum einmal die Zeichenfolge gewonnen wird und nicht über die Analyse es aus einer text-Datei. Sie kann nicht ding die Menschen, für die Beantwortung der Frage, die gestellt wurde und nicht die weiter gefasste Frage es impliziert.
InformationsquelleAutor Sorpigal