"," durch "." ersetzen

"," durch "." ersetzen

am 14.06.2007 10:26:07 von thamos

Hi @ all,

ich lese Kommawerte ein und will mit ihnen rechnen.
Wenn man den Typ "Float" nimmt, liest er 0,5 nur als 0 ein.
Jetzt weiß ich nicht wie ich die zusammenrechnen soll.

also vielleicht entweder
- Jedes Komma in der Spalte durch einen Punkt ersetzen (gibts da einen
Befehl?)
- Ohne Spalte "Float" rechnen...
- Noch eine Spalte erstellen, in der jedes Komma ein Punkt ist.

Wäre dankbar für Vorschläge.

Gruß
Thomas Behrens

Re: "," durch "." ersetzen

am 14.06.2007 10:32:01 von Christian Kirsch

Am 14.06.2007 10:26 schrieb Thomas Behrens:
> Hi @ all,
>
> ich lese Kommawerte ein und will mit ihnen rechnen.
> Wenn man den Typ "Float" nimmt, liest er 0,5 nur als 0 ein.
> Jetzt weiß ich nicht wie ich die zusammenrechnen soll.
>

Warum schreibst Du die Zahlen nicht gleich in dem Format raus, in dem
MySQL sie erwartet?

> also vielleicht entweder
> - Jedes Komma in der Spalte durch einen Punkt ersetzen (gibts da einen
> Befehl?)

man sed
man perl
man awk
man ed

(ohne jetzt durch die Reihenfolge irgendeine Präferenz andeuten zu
wollen).
Wenn Dir das nichts sagt -> google

> - Ohne Spalte "Float" rechnen...

Dunkel ist Deiner Rede Sinn.

> - Noch eine Spalte erstellen, in der jedes Komma ein Punkt ist.

Es wird dunkler...

Re: "," durch "." ersetzen

am 14.06.2007 10:38:05 von thamos

lol bin ich heut dunkel :-)

ich hab kein Linux und habe die Daten auch schon in dem Format in der
Datenbank.
mit PHP könnte ich die Daten auslesen und wieder reinschreiben, das
ist mir aber bei 60.000 Zeilen zu umständlich.
Die Frage war einfach, ob es einen Befehl gibt der etwas ersetzen kann.

Re: "," durch "." ersetzen

am 14.06.2007 10:47:22 von Christian Kirsch

Am 14.06.2007 10:38 schrieb Thomas Behrens:
> lol bin ich heut dunkel :-)
>
> ich hab kein Linux

Wer hat was von Linux gesagt? Cygwin existiert, und auf dem Mac gibt's
die genannten Tools sowieso.

> und habe die Daten auch schon in dem Format in der
> Datenbank.

Du hast Float-Daten als *was* in der "Datenbank" - als Texte, in denen
ein Komma den Dezimalteil vom Rest trennt?

Nö, ne?

> mit PHP könnte ich die Daten auslesen und wieder reinschreiben, das
> ist mir aber bei 60.000 Zeilen zu umständlich.

Wieso ist *dir* das zu umständlich? Ich würde das einfach meinen
Rechner machen lassen, dann ist gut.

> Die Frage war einfach, ob es einen Befehl gibt der etwas ersetzen kann.

Es gibt ein Handbuch - sogar auf Deutsch. Und zwar bei
dev.mysql.com/doc. Dort steht, welche Befehle es gibt. Du möchtest
vielleicht den Teil zum Thema "String-Funktionen" lesen. Was es
allerdings bringen soll, in einem String das , durch einen . zu
ersetzen, wenn man damit rechnen will, weiß ich nicht.

Re: "," durch "." ersetzen

am 14.06.2007 11:10:56 von Michael Ziegler

Christian Kirsch wrote:
> [...] Was es
> allerdings bringen soll, in einem String das , durch einen . zu
> ersetzen, wenn man damit rechnen will, weiß ich nicht.

Das bringt, dass man danach diese Spalte der Tabelle in Float
konvertieren kann und die Nachkommastellen dabei erhalten bleiben. Dann
hat man ein (zumindest in dieser Hinsicht) brauchbares Datenbankdesign
und kann mit den entstandenen Floats rechnen.

Für den Fall dass das mit PHP ausgegeben werden soll würde ich noch die
Lektüre von http://de.php.net/number_format empfehlen.


--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php

Re: "," durch "." ersetzen

am 14.06.2007 11:11:44 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: "," durch "." ersetzen

am 14.06.2007 11:22:28 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: "," durch "." ersetzen

am 14.06.2007 11:23:33 von Christian Kirsch

Am 14.06.2007 11:10 schrieb Michael Ziegler:
> Christian Kirsch wrote:
>> [...] Was es
>> allerdings bringen soll, in einem String das , durch einen . zu
>> ersetzen, wenn man damit rechnen will, weiß ich nicht.
>
> Das bringt, dass man danach diese Spalte der Tabelle in Float
> konvertieren kann und die Nachkommastellen dabei erhalten bleiben. Dann
> hat man ein (zumindest in dieser Hinsicht) brauchbares Datenbankdesign
> und kann mit den entstandenen Floats rechnen.

Falls Du über Rundungsprobleme sprichst:

DECIMAL existiert, und die Dokumentation beschreibt auch das:

http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview .html

Warum willst Du mit Gewalt etwas umständlich nachbauen, was Dir die
Datenbank ohnehin bietet?

Re: "," durch "." ersetzen

am 14.06.2007 11:27:15 von Christian Kirsch

Am 14.06.2007 11:22 schrieb Andreas Kretschmer:
> begin Michael Ziegler schrieb:
>> Christian Kirsch wrote:
>>> [...] Was es
>>> allerdings bringen soll, in einem String das , durch einen . zu
>>> ersetzen, wenn man damit rechnen will, weiß ich nicht.
>> Das bringt, dass man danach diese Spalte der Tabelle in Float
>> konvertieren kann und die Nachkommastellen dabei erhalten bleiben. Dann
>> hat man ein (zumindest in dieser Hinsicht) brauchbares Datenbankdesign
>> und kann mit den entstandenen Floats rechnen.
>
> Was aber auch on-the-fly geht, hier mit PG, sicherlich übertragbar auf
> MySQL:
>
> test=*# select * from foo;
> id | t
> ----+-----
> 5 | 1,2
> 6 | 2,2
> 7 | 3,2
> (3 rows)
>
> test=*# select sum(regexp_replace(t,',','.')::numeric) from foo;

nope - MySQL kennt bislang kein regexp_replace (allerdings normales
REPLACE, was wohl indiesem Fall reichen dürfte - Du benutzt ja auch
keinen regulären Ausdruck ;-)

> Natürlich ist es Dummfug, zur Speicherung von numerischen Werten einen
> Texttyp zu nehmen, nur um Ein- / Ausgabe mit schönem deutschen Komma zu
> haben...

ACK. Und natürlich könnten die Leute, die mit solchen Probleme durch
die Gegend laufen bzw. hier flasche Ratschläge geben, einfach mal
einen *kurzen* (ja, das reicht) Blick in die Dokumentation werfen.

Re: "," durch "." ersetzen

am 14.06.2007 11:44:12 von Thomas Rachel

Thomas Behrens wrote:

> ich hab kein Linux

1. Fordert niemand.

2. Ließe sich trivial ändern. Man benötigt: eine beliebige, meist
kostengünstig oder kostenlos erhältliche Distri, ca. 4-5 GB Platz und,
je nach Rechner, 30-120 Minuten Zeit.

> und habe die Daten auch schon in dem Format in der Datenbank.

Ach so. Ja, dann erübrigt sich das Ganze.


> mit PHP könnte ich die Daten auslesen und wieder reinschreiben,

oder sie vielleicht noch durch die halbe Welt schicken und 3x
untransformieren -

> das ist mir aber bei 60.000 Zeilen zu umständlich.

Naheliegend. ;-)

Wozu auch an PHP weiterleiten - laß sie in MySQL drin und sage dem, es
soll was ändern.

Ich nehme an, daß diese Daten dauerhaft geändert werden sollen.

Ich würde so vorgehen:

- die Tabelle UPDATEn, indem Du die entsprechende Spalte auf den alten
Wert, Kommata durch Punkte ersetzt, setzt. (Ersetzen heißt auf Englisch
REPLACE - das Handbuch, bei hinreichend neuem MySQL auch der help-Befehl
des Kommandozeilenclients, helfen Dir weiter)

- dann noch die Tabelle so umbauen, daß Du eine FLOAT-, DOUBLE- oder
DECIMAL-Tabelle hast. Wenn Du Dir da unsicher bist, kannst Du es
stattdessen auch so machen, daß Du eine entsprechende Spalte hinzufügst,
die Daten rüberüberträgst, anschließend vergleichst und dann erst die
alte Spalte löschst und die neue umbenennst. (Schließlich könnten sich
ja nichtnumerische Werte eingeschlichen haben...) An evtl. vorhandene
Indices denken!


> Die Frage war einfach, ob es einen Befehl gibt der etwas ersetzen kann.

Natürlich. Steht unter dem entsprechenden Namen (wie gesagt: ersetzen
heißt REPLACE auf Englisch) auch im Handbuch (http://dev.mysql.com/)
unter den Stringmanipulationsbefehlen.


HTH,

Thomas
--
while(!asleep()) sheep++;

Re: "," durch "." ersetzen

am 14.06.2007 12:00:18 von Michael Ziegler

Christian Kirsch wrote:
> Falls Du über Rundungsprobleme sprichst:
>
> DECIMAL existiert, und die Dokumentation beschreibt auch das:
>
> http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview .html
>
> Warum willst Du mit Gewalt etwas umständlich nachbauen, was Dir die
> Datenbank ohnehin bietet?

Ich spreche davon dass es einfach Bullsh!t ist, einen String zu nehmen,
wo eine Kommazahl gespeichert werden soll. Ich habe mich dabei vllt. ein
Bisschen zu sehr auf Float fixiert, aber welcher Datentyp _genau_ dazu
verwendet wird war nicht Bestandteil meiner Argumentation.

Es gibt erwiesenermaßen besser geeignete Datentypen als Floats, um
Kommazahlen zu speichern. Besser als String sind jedenfalls alle.

--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php

Re: "," durch "." ersetzen

am 14.06.2007 12:17:48 von Christian Kirsch

Michael Ziegler schrieb:
> Christian Kirsch wrote:
>> Falls Du über Rundungsprobleme sprichst:
>>
>> DECIMAL existiert, und die Dokumentation beschreibt auch das:
>>
>> http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview .html
>>
>> Warum willst Du mit Gewalt etwas umständlich nachbauen, was Dir die
>> Datenbank ohnehin bietet?
>
> Ich spreche davon dass es einfach Bullsh!t ist, einen String zu nehmen,
> wo eine Kommazahl gespeichert werden soll.

ACK

> Ich habe mich dabei vllt. ein
> Bisschen zu sehr auf Float fixiert, aber welcher Datentyp _genau_ dazu
> verwendet wird war nicht Bestandteil meiner Argumentation.
>
> Es gibt erwiesenermaßen besser geeignete Datentypen als Floats, um
> Kommazahlen zu speichern. Besser als String sind jedenfalls alle.
>

Das hängt davon ab, was Du willst. DECIMAL ist prima für die exakte
Speicherung und das Rechnen ohne Rundungsfehler - also z.B. für
Geldbeträge. Andererseits bezahlst Du diese Genauigkeit sicherlich auch
mit Performance-Einbußen (ich vermute, dass bei DECIMAL immer die DB
selber rechnen muss, bei FLOAT hingegen kann sie das der CPU bzw. der
Floatingpoint-Bibliothek überlassen). In MySQL < 5 war DECIMAL durch
Strings implementiert (yuck), d.h. da hat die DB intern genau das getan,
was der OP hier mühsam nachbauen will. Damit würde ich keine komplexen
Rechenoperationen durchführen wollen.

Außerdem könnte es Unterschied hinsichtlich des benutzbaren Zahlenraums
geben: DOUBLE kann Werte zwischen 10^-308 und 10^308 darstellen.
NUMERIC/DECIMAL benutzt maximal 65 Stellen - damit kommst Du
überschlägig auf 10^-65 bis 10^65 als Zahlenraum.

FLOAT/DOUBLE sind also nicht immer schlecht. Man muss halt wissen, was
man tut.

Re: "," durch "." ersetzen

am 14.06.2007 12:27:35 von thamos

hab schon was gefunden ... funktioniert glaub ich ganz gut.

UPDATE `Tabelle1` SET `Spalte2` = replace(`Spalte2`, ",", ".")

Re: "," durch "." ersetzen

am 14.06.2007 12:51:03 von Christian Kirsch

Thomas Behrens schrieb:
> hab schon was gefunden ... funktioniert glaub ich ganz gut.
>
> UPDATE `Tabelle1` SET `Spalte2` = replace(`Spalte2`, ",", ".")
>

Wenn man Pest statt Cholera haben möchte, ist das sicherlich eine gut
funktionierende Lösung.

Re: "," durch "." ersetzen

am 14.06.2007 13:13:15 von thamos

On 14 Jun., 12:51, Christian Kirsch wrote:
> Thomas Behrens schrieb:
>
> > hab schon was gefunden ... funktioniert glaub ich ganz gut.
>
> > UPDATE `Tabelle1` SET `Spalte2` =3D replace(`Spalte2`, ",", ".")
>
> Wenn man Pest statt Cholera haben möchte, ist das sicherlich eine gut
> funktionierende Lösung.

warum soll das schlecht sein?

Re: "," durch "." ersetzen

am 14.06.2007 13:16:39 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: "," durch "." ersetzen

am 14.06.2007 13:32:52 von Kai Ruhnau

Andreas Kretschmer schrieb:
> begin Thomas Behrens schrieb:
>> On 14 Jun., 12:51, Christian Kirsch wrote:
>>> Thomas Behrens schrieb:
>>>
>>>> hab schon was gefunden ... funktioniert glaub ich ganz gut.
>>>> UPDATE `Tabelle1` SET `Spalte2` = replace(`Spalte2`, ",", ".")
>>> Wenn man Pest statt Cholera haben möchte, ist das sicherlich eine gut
>>> funktionierende Lösung.
>> warum soll das schlecht sein?
>
> Die Antwort auf diese Frage sollte sich Dir erschließen, wenn Du mal
> alle anderen Antworten hier lesen würdest. Und falls das dann Dir noch
> immer nicht klar wird, dann hätte eine direkte Antwort hier auch nicht
> viel Sinn.

Wir haben keine Definition von Spalte2 - es kann durchaus sein, dass
diese einen gewünschten, numerischen Datentyp hat. Die implizite
Typkonvertierung string->numerisch von MySQL funktioniert dann wie erwartet.

Grüße
Kai

Re: "," durch "." ersetzen

am 14.06.2007 13:49:34 von Kay-Michael Voit

> warum soll das schlecht sein?
Warum ignorierst Du bis jetzt immer vollständig, wenn jemand darauf
hinweist, dass mit großer Wahrscheinlich Dein Datenmodell kaputt ist,
wenn sowas nötig wird?

Re: "," durch "." ersetzen

am 14.06.2007 14:02:51 von Christian Kirsch

Kai Ruhnau schrieb:
> Andreas Kretschmer schrieb:
>> begin Thomas Behrens schrieb:
>>> On 14 Jun., 12:51, Christian Kirsch wrote:
>>>> Thomas Behrens schrieb:
>>>>
>>>>> hab schon was gefunden ... funktioniert glaub ich ganz gut.
>>>>> UPDATE `Tabelle1` SET `Spalte2` = replace(`Spalte2`, ",", ".")
>>>> Wenn man Pest statt Cholera haben möchte, ist das sicherlich eine gut
>>>> funktionierende Lösung.
>>> warum soll das schlecht sein?
>> Die Antwort auf diese Frage sollte sich Dir erschließen, wenn Du mal
>> alle anderen Antworten hier lesen würdest. Und falls das dann Dir noch
>> immer nicht klar wird, dann hätte eine direkte Antwort hier auch nicht
>> viel Sinn.
>
> Wir haben keine Definition von Spalte2 - es kann durchaus sein, dass
> diese einen gewünschten, numerischen Datentyp hat. Die implizite
> Typkonvertierung string->numerisch von MySQL funktioniert dann wie erwartet.
>

Wenn Spalte2 schon einen numerischen Datentyp hätte, wie wäre dann das
Komma da überhaupt reingekommen? Und welchen Sinn hätte ein REPLACE (das
ja auf Strings arbeitet) in dem Fall überhaupt?

Re: "," durch "." ersetzen

am 14.06.2007 16:11:30 von Kai Ruhnau

Christian Kirsch schrieb:
> Kai Ruhnau schrieb:
>> Andreas Kretschmer schrieb:
>>> begin Thomas Behrens schrieb:
>>>> On 14 Jun., 12:51, Christian Kirsch wrote:
>>>>> Thomas Behrens schrieb:
>>>>>
>>>>>> hab schon was gefunden ... funktioniert glaub ich ganz gut.
>>>>>> UPDATE `Tabelle1` SET `Spalte2` = replace(`Spalte2`, ",", ".")
>>>>> Wenn man Pest statt Cholera haben möchte, ist das sicherlich eine gut
>>>>> funktionierende Lösung.
>>>> warum soll das schlecht sein?
>>> Die Antwort auf diese Frage sollte sich Dir erschließen, wenn Du mal
>>> alle anderen Antworten hier lesen würdest. Und falls das dann Dir noch
>>> immer nicht klar wird, dann hätte eine direkte Antwort hier auch nicht
>>> viel Sinn.
>> Wir haben keine Definition von Spalte2 - es kann durchaus sein, dass
>> diese einen gewünschten, numerischen Datentyp hat. Die implizite
>> Typkonvertierung string->numerisch von MySQL funktioniert dann wie erwartet.
>>
>
> Wenn Spalte2 schon einen numerischen Datentyp hätte, wie wäre dann das
> Komma da überhaupt reingekommen? Und welchen Sinn hätte ein REPLACE (das
> ja auf Strings arbeitet) in dem Fall überhaupt?

Hoppla, ich hatte das im REPLACE als `Spalte1` gelesen und nicht
`Spalte2`. So hast du natürlich Recht.

Grüße
Kai