Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Das deutsche Zahlenformat

118 views
Skip to first unread message

Oscar76

unread,
Jul 31, 2006, 5:10:04 AM7/31/06
to
Hallo,

da ich mich schon seit Stunden damit erfolglos rumschlage, poste ich
mein Problem mal:

Ich versuche einfach nur eine CSV-Datei zu importieren. In ihr sind die
Zahlen folgendermaßen sortiert: 1.000,00
Gibt es Möglichkeit beim Import das Komma als Dezimaltrennzeichen
durch einen Punkt zu ersetzen?

Christian Kirsch

unread,
Jul 31, 2006, 5:13:35 AM7/31/06
to
Oscar76 schrieb:

Du könntest sed benutzen. Oder die Zahlen so exportieren, wie MySQL
sie erwartet.

Und leg Dir bitte einen Realnamen zu - oder haben Deine Eltern Dich
Oscar76 getauft?

Oscar76

unread,
Jul 31, 2006, 5:17:56 AM7/31/06
to

Hallo Christian,

kannst du mir sagen was sed ist?

Andreas Kretschmer

unread,
Jul 31, 2006, 5:36:39 AM7/31/06
to
begin Oscar76 <bartez20...@yahoo.de> wrote:

> Hallo Christian,

> kannst du mir sagen was sed ist?

Möglicherweise wird er Dir nicht mehr antworten, weil Du seine Bitte
nach einem Realnamen nicht befolgt hast. Und ich werde letztmalig Dir
antworten: Stream-Editor.

end
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Chris Schneider

unread,
Jul 31, 2006, 5:44:43 AM7/31/06
to
Hallo,

das war nicht mit Absicht gemeint. Ich habe meinen Namen in den
Einstellungen geändert. Wahrscheinlich an der falschen Stelle. Ich
arbeite nocht nicht lange mit GoogleGroups. Ich bitte um Entschuldigung
falls ich den Ansprüchen nicht gerecht wurde.
Ich habe mir sed gerade gedownloadtet. Gibt es eine spezielle Syntax um
meine Datei zu konvertieren unter DOS?

Christian Kirsch

unread,
Jul 31, 2006, 5:48:52 AM7/31/06
to
Chris Schneider schrieb:

Unter Unix geht das so:
sed -e 's/\./,/g' < datei-rein > datei-raus

Unter DOS sollte es analog funktionieren. Damit ersetzt Du Punkte (\.)
durch Kommata (,), allerdings überall (also wird aus "Dr. Müller" dann
"Dr, Müller"). Etwas spezifischer geht es so:
sed -e 's/\([0-9]\)\.\([0-9]\)/\1,\2/g'
(ungetestet). Das ersetzt jeden Punkt (\.) zwischen zwei Ziffern
([0-9]...[0-9]) durch die erste Ziffer (\1), ein Komma (,) und die
zweite Ziffer (\2).

Chris Schneider

unread,
Jul 31, 2006, 6:42:26 AM7/31/06
to
Vielen dank für die schnellen Antworten.

Chris Schneider

unread,
Jul 31, 2006, 7:14:04 AM7/31/06
to

Christian Kirsch schrieb:

>
> Unter Unix geht das so:
> sed -e 's/\./,/g' < datei-rein > datei-raus
>
> Unter DOS sollte es analog funktionieren. Damit ersetzt Du Punkte (\.)
> durch Kommata (,), allerdings überall (also wird aus "Dr. Müller" dann
> "Dr, Müller"). Etwas spezifischer geht es so:
> sed -e 's/\([0-9]\)\.\([0-9]\)/\1,\2/g'
> (ungetestet). Das ersetzt jeden Punkt (\.) zwischen zwei Ziffern
> ([0-9]...[0-9]) durch die erste Ziffer (\1), ein Komma (,) und die
> zweite Ziffer (\2).

Hmm,

bist du dir sicher? Wenn ich folgendes eingebe funktioniert es: sed -e
's/\([0-9]\)\,\([0-9]\)/\1.\2/g'
Allerdings wird aus dem Tausender-Punkt auch ein Komma. Wenn ich dies
in eine mysql-Tabelle lade, stimmen die Zahlen nicht.

Andreas Kretschmer

unread,
Jul 31, 2006, 7:34:32 AM7/31/06
to
begin Chris Schneider <bartez20...@yahoo.de> wrote:
>> Unter DOS sollte es analog funktionieren. Damit ersetzt Du Punkte (\.)
>> durch Kommata (,), allerdings überall (also wird aus "Dr. Müller" dann
>> "Dr, Müller"). Etwas spezifischer geht es so:
>> sed -e 's/\([0-9]\)\.\([0-9]\)/\1,\2/g'
>> (ungetestet). Das ersetzt jeden Punkt (\.) zwischen zwei Ziffern
>> ([0-9]...[0-9]) durch die erste Ziffer (\1), ein Komma (,) und die
>> zweite Ziffer (\2).

> Hmm,

> bist du dir sicher? Wenn ich folgendes eingebe funktioniert es: sed -e
> 's/\([0-9]\)\,\([0-9]\)/\1.\2/g'

Christians Beispiel funktioniert IMHO wie von ihm beschrieben. Du
solltest nicht erwarten, daß jedes Beispiel dieser Welt auf Deinen
konkreten Fall paßt.


> Allerdings wird aus dem Tausender-Punkt auch ein Komma. Wenn ich dies
> in eine mysql-Tabelle lade, stimmen die Zahlen nicht.

Gut beobachtet. Zur Übung liest Du Dir nun ein Kapitel zu REGEX durch,
was Du sehr leicht via Google finden wirst. Hint: Du willst zuerst
einmal in der Zahl den Punkt durch nichts ersetzen.

Thomas Rachel

unread,
Jul 31, 2006, 7:39:16 AM7/31/06
to
Chris Schneider wrote:

> bist du dir sicher? Wenn ich folgendes eingebe funktioniert es: sed -e
> 's/\([0-9]\)\,\([0-9]\)/\1.\2/g'
> Allerdings wird aus dem Tausender-Punkt auch ein Komma.

Naja, den mußt Du dann vorher halt entfernen...


Thomas

Chris Schneider

unread,
Aug 1, 2006, 1:58:21 AM8/1/06
to

Andreas Kretschmer schrieb:

Boahh. Jetzt raucht mein Kopf. Werd mal versuchen , mir einen Kaffee
ohne komplizierte Beschreibung zu machen. ;-)
Am besten wirds wohl sein, wenn ich die Datei vorher mit OO-Calc
bearbeite, bevor ich sie in mysql ziehe.

Carsten Wiedmann

unread,
Aug 1, 2006, 7:43:00 AM8/1/06
to
Oscar76 schrieb:

> Ich versuche einfach nur eine CSV-Datei zu importieren. In ihr sind die
> Zahlen folgendermaßen sortiert: 1.000,00
> Gibt es Möglichkeit beim Import das Komma als Dezimaltrennzeichen
> durch einen Punkt zu ersetzen?

Nurmal eine Frage:
In was für eine Version von MySQL willst du das Importieren?

BTW:
Wie sieht denn so ein Beispieldatnsatz im CSV genau aus?

Gruß
Carsten

Chris Schneider

unread,
Aug 1, 2006, 8:10:27 AM8/1/06
to

Carsten Wiedmann schrieb:

Also ich nutze mysql 4.0.22-nt.

Carsten Wiedmann

unread,
Aug 1, 2006, 10:00:53 AM8/1/06
to
Chris Schneider schrieb:

> > Nurmal eine Frage:
> > In was für eine Version von MySQL willst du das Importieren?
> >

> Also ich nutze mysql 4.0.22-nt.

Schad. Mit einer aktuellen Version hättest du dir den Umweg über sed o.ä.
sparen können.


> > Wie sieht denn so ein Beispieldatnsatz im CSV genau aus?

Da das hier jetzt keiner kennt, kann man natürlich nur ein Prinzip nennen
und keine genaue Lösung. Die Lösung von Christian funktioniert aber
einwandfrei:

Zuerst nehmen wir eine CSV-Datei
| >type in.csv
| 1;"Carsten";1.024,24
| 2;"Wiedmann";224,11

Bei der Zahlen muss man also erstes einen Punkt zwischen zwei Ziffern durch
"nichts" ersetzen:
"s/\([0-9]\)\.\([0-9]\)/\1\2/g"
und dann ein Komma zwischen zwei Ziffern durch einen Punkt ersetzen:


"s/\([0-9]\)\,\([0-9]\)/\1.\2/g"

Ergibt:
| >sed -e "s/\([0-9]\)\.\([0-9]\)/\1\2/g" -e
"s/\([0-9]\)\,\([0-9]\)/\1.\2/g" in.csv
| 1;"Carsten";1024.24
| 2;"Wiedmann";224.11

Wenn du da jetzt noch ein " >out.csv" hinten dran hängst, bekommst du es
nicht nur angezeigt, sondern in eine extra Datei (out.csv) gespeichert. Wenn
du statt dessen als ersten Parameter "-i" benutzt, änderst du dirkt die
Eingabedatei (in.csv).

Gruß
Carsten


Chris Schneider

unread,
Aug 2, 2006, 4:03:38 AM8/2/06
to
Hallo Carsten

>
> Schad. Mit einer aktuellen Version hättest du dir den Umweg über sed o.ä.
> sparen können.
>


Kann ich etwa in mysql 5 zahlen mit Komma als Dezimaltrennzeichen
importieren?

>
> > > Wie sieht denn so ein Beispieldatensatz im CSV genau aus?
>


Habe ich vergessen. Sorry. So wie unten sieht es in etwa aus.

>Die Lösung von Christian funktioniert aber einwandfrei:
>
> Zuerst nehmen wir eine CSV-Datei
> | >type in.csv
> | 1;"Carsten";1.024,24
> | 2;"Wiedmann";224,11
>
> Bei der Zahlen muss man also erstes einen Punkt zwischen zwei Ziffern durch
> "nichts" ersetzen:
> "s/\([0-9]\)\.\([0-9]\)/\1\2/g"
> und dann ein Komma zwischen zwei Ziffern durch einen Punkt ersetzen:
> "s/\([0-9]\)\,\([0-9]\)/\1.\2/g"
>
> Ergibt:
> | >sed -e "s/\([0-9]\)\.\([0-9]\)/\1\2/g" -e
> "s/\([0-9]\)\,\([0-9]\)/\1.\2/g" in.csv
> | 1;"Carsten";1024.24
> | 2;"Wiedmann";224.11
>
> Wenn du da jetzt noch ein " >out.csv" hinten dran hängst, bekommst du es
> nicht nur angezeigt, sondern in eine extra Datei (out.csv) gespeichert. Wenn
> du statt dessen als ersten Parameter "-i" benutzt, änderst du dirkt die
> Eingabedatei (in.csv).
>
> Gruß
> Carsten

Super. Jetzt klappt es einwandfrei. Vielen Dank.

Carsten Wiedmann

unread,
Aug 2, 2006, 9:22:04 AM8/2/06
to
Chris Schneider schrieb:

> > Schad. Mit einer aktuellen Version hättest du dir den Umweg über sed
> > o.ä.
> > sparen können.
>
> Kann ich etwa in mysql 5 zahlen mit Komma als Dezimaltrennzeichen
> importieren?

Direkt erkennt MySQL das dort auch nicht. Aber das was sed macht, kannst du
dort recht einfach beim Import erledigen.

> > Zuerst nehmen wir eine CSV-Datei
> > | type in.csv
> > | 1;"Carsten";1.024,24
> > | 2;"Wiedmann";224,11

Mit dem Beispiel CSV im Konsolenclient ausgeführt:
| USE `foo`;
| LOAD DATA LOCAL INFILE 'in.csv'
| INTO TABLE `bar`
| FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
| LINES TERMINATED BY '\r\n'
| (`id`, `name`, @var1)
| SET `zahl` = REPLACE(REPLACE(@var1, '.', ''), ',', '.');

Die letzte Zeile ist dann das, was vorher sed machte. Hat hier dann zudem
den Vorteil, dass es sich auch wirklich nur auf die Spalte `zahl` auswirkt.
(Siehe unten)


> > | sed -e "s/\([0-9]\)\.\([0-9]\)/\1\2/g" -e
> > "s/\([0-9]\)\,\([0-9]\)/\1.\2/g" in.csv
> > | 1;"Carsten";1024.24
> > | 2;"Wiedmann";224.11
>

> Super. Jetzt klappt es einwandfrei. Vielen Dank.

Kein Problem. Wie oben schon angedeutet, musst halt bei dieser einfachen
REGEX auf eines Aufpassen:
Die Erzetzungen passieren hier immer im ganzen Datensatz und nicht nur in
einem Feld. Je nach Inhalt der übrigen Felder, könnest du so natürlich auch
was verändern, dass du gar nicht willst.

Gruß
Carsten

Message has been deleted

Carsten Wiedmann

unread,
Aug 2, 2006, 12:33:12 PM8/2/06
to
Robert Eckl schrieb:

> Am Tue, 1 Aug 2006 16:00:53 +0200 schrieb Carsten Wiedmann:
>
> > Chris Schneider schrieb:
> >
> > > > Nurmal eine Frage:
> > > > In was für eine Version von MySQL willst du das Importieren?
> > > >
> > > Also ich nutze mysql 4.0.22-nt.
> >
> > Schad. Mit einer aktuellen Version hättest du dir den Umweg über sed
> > o.ä. sparen können.
> >

> Jetzt hast Du mich neugierig gemacht.
> Wie geht das mit 5.0.22 oder 5.1.11?
> Hab mir zwar mit sed beholfen (auch Datum mußten angepaßt werden), aber
> eine Alternative zu sed hab ich bislang nicht gefunden.

Eine kurze Frage. ca. eine 3/4h vor deinem Post habe ich Chris in [1]
nochmal geantwortet. Beantwortet das dort grundsätzlich deine Frage?

Gruß
Carsten

[1] <44d0a78e$0$24889$9b4e...@newsread4.arcor-online.net>

Message has been deleted

Chris Schneider

unread,
Aug 3, 2006, 2:08:16 AM8/3/06
to

Carsten Wiedmann schrieb:

> Mit dem Beispiel CSV im Konsolenclient ausgeführt:
> | USE `foo`;
> | LOAD DATA LOCAL INFILE 'in.csv'
> | INTO TABLE `bar`
> | FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
> | LINES TERMINATED BY '\r\n'
> | (`id`, `name`, @var1)
> | SET `zahl` = REPLACE(REPLACE(@var1, '.', ''), ',', '.');


Hallo,

mal wieder eine ganz doofe frage von mir: Was ist "@var1" ?. Ist das
ein Spaltenname?

Thomas Rachel

unread,
Aug 3, 2006, 2:25:33 AM8/3/06
to
Chris Schneider wrote:

[...]


>> | LINES TERMINATED BY '\r\n'
>> | (`id`, `name`, @var1)
>> | SET `zahl` = REPLACE(REPLACE(@var1, '.', ''), ',', '.');
>
>
> Hallo,
>
> mal wieder eine ganz doofe frage von mir: Was ist "@var1" ?. Ist das
> ein Spaltenname?

Ohne jetzt im HANDBUCH[1] nachgesehen zu haben, einfach nur aus obigem
erraten: ich vermute, daß in den Klammern die Ziele für die Daten aus der
Datei stehen (entweder Spalten einer Tabelle oder VARIABLEN) und hinter dem
SET dann Anweisungen für weitere Spalten, die sich aus VARIABLEN herleiten.


BTW: Auch vor 5.x kann man auf sed verzichten. Entweder lädt man das Zeugs
in eine temporäre Tabelle und führt dann bei der Überführung der Daten in
die permanente Tabelle obiges REPLACE durch, oder man spendiert der
permanenten Tabelle übergangsweise eine zusätzliche Spalte, die man dann
ansschließend modifiziert.


HTH,

Thomas

[1] das ist das Ding, auf welches in dieser Newsgroup so oft hingewiesen
wird. Es sollte somit leicht zu finden sein.
--
Der Begriff »Pessimismus« wird von Optimisten verwendet, um jene Leute zu
diskreditieren, die die Welt so sehen, wie sie wirklich ist.
[Luton in Discworld Noir]

0 new messages