Hallo! Ich habe eine CSV-Datei (im Folgenden file genannt, Feldtrenner ist der Strichpunkt ";"), in der in der 4. Spalte steht ein Datum im Format TT.MM.JJJJ. Für einen Datenbankimport brauche ich aber das Datum im Amerikanischen Format, also JJJJ-MM-TT. Ich bekomme nun mit folgendem Schnipsel zumindest das jeweilige Datum ausgegeben. awk -F";" '{print $4}' file Nur wie verarbeite ich es weiter, damit ich es anschließend richtig herum habe? Am besten wäre eine Hilfe, bei der die 4. Spalte wie oben abgeändert und der Rest unverändert übernommen wird. :-) Danke schonmal! Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Am 2007-07-13 00:14, schrieb Martin Ereth:
Ich habe eine CSV-Datei (im Folgenden file genannt, Feldtrenner ist der Strichpunkt ";"), in der in der 4. Spalte steht ein Datum im Format TT.MM.JJJJ.
Für einen Datenbankimport brauche ich aber das Datum im Amerikanischen Format, also JJJJ-MM-TT.
Ohne Dir jetzt eine Loesung anbieten zu koennen, das hat mit Amerikanisch nicht zu tun, dass ist ISO 8601, auch in Deutschland schon lange ein gueltiges Datumsformat. Viele, wenn nicht alle Datenbanken speichern das Datum so oder ohne Trenner. achso; Amertikanisch MM-DD-YYYY wobei ich den Trenner gerade nicht weiss. Sorry Holger -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Martin, Martin Ereth schrieb:
Hallo!
Ich habe eine CSV-Datei (im Folgenden file genannt, Feldtrenner ist der Strichpunkt ";"), in der in der 4. Spalte steht ein Datum im Format TT.MM.JJJJ.
Für einen Datenbankimport brauche ich aber das Datum im Amerikanischen Format, also JJJJ-MM-TT.
Du erzeugst einen regulären Ausdruck mit drei Klammerpaaren und verwendest 'backreferences' /...regex.../\3-\2-\1/p regex: TT kann 0 gefolgt von 1-9, 1 gefolgt von 0-9, 2 gefolgt von 0-9 oder 3 gefolgt von 0-1 sein. also: (0[1-9]|[1-2][0-9]|3[0-1]) MM kann 0 gefolgt von 1-9 oder 1 gefolgt von 0-2 sein. also : (0[1-9]|1[0-2]) YY kann 158 gefolgt von 3-9, 159 gefolgt von 0-9, 16 gefolgt von 0-9 gefolgt von 0-9, 17 gefolgt von 0-9 gefolgt von 0-9, 18 gefolgt von 0-9 gefolgt von 0-9, 19 gefolgt von 0-9 gefolgt von 0-9, 2 gefolgt von 0-9 gefolgt von 0-9 gefolgt von 0-9 sein. also (2\d\d\d|1[6-9]\d\d|159[0-9]|158[3-9]) Ergebnis: /(0[1-9]|[1-2][0-9]|3[0-1]).(0[1-9]|1[0-2]).(2\d\d\d|1[6-9]\d\d|159[0-9]|158[3-9])/\3-\2-\1/p Ich bin nicht sicher, ob den Klammern bzw. den Punkten ein \ voranstellen mußt. Schau in die man page. Der Punkt soll auf einen literalen Punkt passen (nicht auf jeden Buchstaben). Die Klammern sollen gruppieren. Fall Du MySQL benutzt, funktioniert vielleicht auch die Datumsfunktion CAST('13.07.2007' AS DATE). Gruß, Oliver -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Fri, Jul 13, 2007 at 12:14:35AM +0200, Martin Ereth wrote:
Nur wie verarbeite ich es weiter, damit ich es anschließend richtig herum habe?
Ich bin bei sowas meist so faul, das ich das ganze File im Editor bearbeite. Dort wuerde ich in diesem Fall nach ";(\d\d)\.(\d\d)\.(\d\d\d\d);" suchen und es durch ";\3-\2-\1;" ersetzen. In Awk ist dein Ansatz schon gut, du kann in awk Programmen den Wert von $4 verandern und mit print $0 den ganzen, inkl dem veraenderten 4. Feld wieder ausgeben. Wenn du Glueck hast, bzw. dein awk so schreibst das immer 10 Zeichen fuer das Datum verwendet werden, da Nullen zum auffuellen verwendet wurden, kannst du das schreiben: awk -F";" '{ sub(/([0-9]{2})[.]([0-9]{2})[.]([0-9]{4})/, "\\3-\\2-\\1", $4) print $0 }' Irgendwas klappt daran aber nicht. Anderer Ansatz: awk -F";" '{split($4, a, ".") $4 = a[3] "-" a[2] "-" a[1] OFS=";" print $0}' Peter -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallöle, Am Freitag, 13. Juli 2007 01:45 schrieb Peter Wiersig:
awk -F";" '{split($4, a, ".") $4 = a[3] "-" a[2] "-" a[1] OFS=";" print $0}'
Die Zeilenenden müssen in awk mit `;` abgeschlossen werden, also awk -F\; '{ split($4, a, "."); $4 = a[3] "-" a[2] "-" a[1]; OFS=";"; print $0}' oder in einer Zeile awk -F\; '{split($4, a, ".");$4 = a[3] "-" a[2] "-" a[1]; OFS=";";print $0}' Dann funktionierts auch ;) Gruss Mario -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Fri, Jul 13, 2007 at 09:01:40AM +0200, Mario van der Linde wrote:
Am Freitag, 13. Juli 2007 01:45 schrieb Peter Wiersig:
awk -F";" '{split($4, a, ".") $4 = a[3] "-" a[2] "-" a[1] OFS=";" print $0}'
Die Zeilenenden müssen in awk mit `;` abgeschlossen werden, also ^^^^^^ Nee: A newline at any other point is considered the end of the statement. info "(gawk)Statements/Lines"
Dann funktionierts auch ;)
Der andere Ansatz funktionierte immer schon, das mit der Regex und dem veraendern von $4 hat nicht geklappt. Peter -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Fre, 13 Jul 2007, Martin Ereth schrieb:
Ich habe eine CSV-Datei (im Folgenden file genannt, Feldtrenner ist der Strichpunkt ";"), in der in der 4. Spalte steht ein Datum im Format TT.MM.JJJJ.
Für einen Datenbankimport brauche ich aber das Datum im Amerikanischen Format, also JJJJ-MM-TT.
Ich bekomme nun mit folgendem Schnipsel zumindest das jeweilige Datum ausgegeben. awk -F";" '{print $4}' file Nur wie verarbeite ich es weiter, damit ich es anschließend richtig herum habe?
awk -F';' '{ split($4, a, /\./); printf("%04i-%02i-%02i\n", a[3], a[2], a[1]); }' RTFM, -dnh -- ... you start off with a typical message, let's say a 2.5MB Word document containing three lines of text and a macro virus ... -- Peter Gutmann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller schrieb:
Am Fre, 13 Jul 2007, Martin Ereth schrieb:
Ich habe eine CSV-Datei (im Folgenden file genannt, Feldtrenner ist der Strichpunkt ";"), in der in der 4. Spalte steht ein Datum im Format TT.MM.JJJJ.
Für einen Datenbankimport brauche ich aber das Datum im Amerikanischen Format, also JJJJ-MM-TT.
Ich bekomme nun mit folgendem Schnipsel zumindest das jeweilige Datum ausgegeben. awk -F";" '{print $4}' file Nur wie verarbeite ich es weiter, damit ich es anschließend richtig herum habe?
awk -F';' '{ split($4, a, /\./); printf("%04i-%02i-%02i\n", a[3], a[2], a[1]); }'
Danke, Ihr drei! Davids und Peters Lösung gehen ja eindeutig in die gleiche Richtung. Oliver: Solange deine Lösung das gleiche Ergebnis bringt, kann es ja für eine "quick and dirty"-Änderung in einer Datei egal sein... ;-) Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (6)
-
David Haller
-
Holger Bruenjes
-
Mario van der Linde
-
Martin Ereth
-
Oliver Block
-
Peter Wiersig