Ankündigung

Einklappen
Keine Ankündigung bisher.

Datentypen bei csv Import

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datentypen bei csv Import

    ich möchte eine csv Datei mit Sportergebnissen in eine SQL-Tabelle importieren. Dabei gibt es 2 Probleme mit Datentypen:

    1. Sportleistung
    Code:
    W11;800;03:02,68;e;;1;;8052010;Mnchen
    M13;75;10,87;e;;1;;8052010;Mnchen
    M13;60H;10,89;e;;1;;8052010;Mnchen
    M13;WEI;4,57;;;1;;8052010;Mnchen
    M13;HOC;1,44;;;1;;8052010;Mnchen
    M13;BAL;28,00;;;1;;8052010;Mnchen
    Welchen Datentyp muß ich für Spalte 3 wählen, um die Zahlen (Zeiten, Weiten) in dieser Form korrekt darstellen zu können? Ich brauche einen Datentyp auf den ich später Abfragen wie MAX / MIN anwenden kann.
    3:02,68 min
    10,87 sec
    10,89 sec
    4,57 m
    1,44 m
    28,00 m

    2. Umlaute Problem
    Die csv Datei ist im ANSI Format, also
    á für ß oder " für ö
    Wie kann ich eine korrekte Darstellung in der Tabelle erreichen, dort steht immer nur ? an den betrefffenden Stellen?
    Muß ich das Importformat spezifizieren (wenn ja, welche Einstellung: ANSI-Zeichensatz nicht auswählbar). Oder muß ich ein spezielles Kollations-format wählen -welche?

    Vielen Dank.
    -lauberhorn

  • #2
    zu 1: Ich würd in dem Feld die Zeiten in Millisekunden und die Weite in Millimeter speichern. Jenachdem, wie genau die Werte sind. Der Datentyp wäre dann immer INT.

    Das würde für Zeiten von 0 Millisekunden bis 24 Tage reichen.
    Und für Weiten von 0 mm bis 2 km reichen.

    zu 2: Soweit ich weiß werden die Daten normalerweise als UTF8-Zeichenkette an den MySQL-Server übertragen und dann in den jeweiligen Feld-Datentyp umgewandelt. Du musst die Zeichenkette also in den passenden Charset umwandeln.

    Als Feld-Datentyp würde ich dann "utf8_general_ci" wählen.

    Ich nehme mal an "iso-8859-1" nach "utf-8". Einfach mal ausprobieren.

    Gibt dafür verschiedene Funktionen, die sich dazu eignen:
    PHP: mb_convert_encoding - Manual
    PHP: iconv - Manual
    PHP: utf8_encode - Manual

    EDIT: Aber ehrlich gesagt, blick ich da auch nie durch welches Charset jetzt wo verwendet wurde. Da wird man wohl einfach ausgiebig testen müssen, auch mit kyrillischen Buchstaben etc.

    EDIT2: Das mit "iso-8859-1" nach "utf-8" ist Unsinn. PHP nutzt intern "iso-8859-1". "iso-8859-1" wäre also genau richtig. siehe unten.

    Kommentar


    • #3
      Danke ersteinmal - ich habe gestern noch einiges probiert, ohne richtigen Erfolg

      zu1) mit der Umwandlung ist eine gute Idee. Lieber würde ich allerdings die Daten direkt einlesen, weil so zur Verfügung gestellt.
      Lassen wir mal die 800m Zeiten außen vor, so sind die anderen Zeiten/Weiten immer im Format 9,78 oder 32,50 abgespeichert also Dezimalzahl mit 2 Stellen. Wie kann ich das einfach darstellen.

      Zur 800m Zeit. In Excel wähle ich da ein benutzerdefiniertes Datenformat: mm:ss,00 und es paßt, gibt es was vergleichbares in mySQL?

      zu 2) da bin ich noch am Probieren. Schlimmstenfalls muß ich es per Search/Replace in einem Editor vorher anpassen.

      Kommentar


      • #4
        zu 1: Soweit ich weiß unterstützt MySQL nicht solche benutzerdefinierte Datentypen.

        Du musst dich auf eine Einheit festlegen und diese als numerischen Wert speichern.
        Also entweder als INT (ohne Nachkommastellen), als DECIMAL (Fixkommazahl, also feste Anzahl an Nachkommastellen) oder als DOUBLE (Gleitkommazahl, würde ich hier aber nicht verwenden).

        Bei den Weiten also entweder alles als cm oder Meter speichern.

        Bei cm würdest du keine Nachkommastellen mehr brauchen, weswegen INT reicht.
        Bei m bräuchtest du 2 Nachkommastellen, weswegen sich DECIMAL(7,2) anbieten würde. (9 Dezimalstellen brauchen exakt 4 Byte).

        zu 2: Mit welchem Programm wurde die CSV-Datei erstellt? Kann es sein, dass es ein DOS-Programm war ... scheint mir grad so. Sieht ein wenig nach Codepage-437 bzw. Codepage-850 (DOS) aus.

        Kannst du die CSV-Datei evtl gezippt hochladen, damit ich mir das in einem Hexeditor angucken kann? Das Forum könnte das ein wenig verfälschen.

        Zitat von lauberhorn Beitrag anzeigen
        Schlimmstenfalls muß ich es per Search/Replace in einem Editor vorher anpassen.
        Davon rate ich ab. Es wird immer einige Zeichen geben, die du dann vergisst. Benutz dafür lieber die fertigen Funktionen. Musst halt nur herausfinden, um welche Zeichensätze es sich handelt.

        Kommentar


        • #5
          das ist super, dass Du Dich diesem Thema so annimmst.

          zu 2) Umlaute
          mit DOS liegst Du absolut richtig. Die Daten haben ihren Ursprung in alten DOS-Anwendungen (Wettkampf-SW des DLV: RIEPING bzw. COSA). Ich hänge mal die Datenspec mit an. Auf S. 38 findest Du das Problem. Die Daten werden vom Wettkampfprogramm im DOS Zeichensatz erzeugt (links unten) und sind dann für andere Programme im ANSI Format nicht mehr lesbar bzgl. der Umlaute (rechte Seite unten). Das funktioniert soweit, wenn ich in dieser alten DOS-Welt bleibe. Ich möchte nun aber die Ergbnisse im Internet per mySQL ablegen und eine Auswerte SW in PHP darüberlegen.

          1. Das pdf ist zu gross für den upload - hier der link zum Hersteller (Seite "38")
          http://www.rieping-software.de/jooml...=15&Itemid=136

          2. Eine Ergebnis- (BLN-) Datei mit den verfälschten Umlauten http://blv-sport.de/service/msonline...23813813-b.bln

          Kommentar


          • #6
            zu 2:

            So, hab mir das jetzt mal angesehen und korrigiere das mit UTF-8 in meinem ersten Post mal.

            Die PHP-MySQL-Funktionen verlangenen generell einen String mit dem Zeichensatz "iso-8859-1", weil das der Zeichensatz ist, den PHP 4.x und PHP 5.x intern benutzen. Was ich am Anfang geschrieben hab mit der Umwandlung von "iso-8859-1" nach "utf-8" ist also Unsinn, sry.

            Der Query-String beim Aufruf von mysql_query muss also in "iso-8859-1" kodiert sein.
            Deine Datei verwendet aber den Codepage-850 (DOS-Latin-1, Westeuropäisch).
            Das heißt, dass du den eingelesenen String von "cp850" in "iso-8859-1" umwandeln musst, bevor du ihn an die mysql-Funktionen weitergibst.

            Das geht entweder mit [man]iconv[/man] oder mit der etwas umfangreicheren [man]mb_convert_encoding[/man].
            z.B. $text = iconv("cp850", "iso-8859-1", $text);

            Der MySQL-Server wandelt die Zeichenkette beim Eintragen in die Datenbank dann nocheinmal in den jeweiligen Zeichensatz für das Feld um (Kollation).

            Normalerweise nehme ich als Kollation immer "utf8_bin" (case sensitive) bzw. "utf8_general_ci" (case insensitive), weil dieser Zeichensatz praktisch alle Zeichen unterstützten.
            Hier würde aber auch im Prinzip "cp850_bin" bzw. "cp850_general_ci" ausreichen; obwohl ich trotzdem utf8 bevorzugen würde.

            Ich hoffe das stimmt jetzt alles so, was ich gesagt hab

            Als Codebeispiel hab ich mal ne PHP-Funktion hochgeladen, die .bln-Dateien einliest (mit Stringumwandlung, aber ohne Umwandlung von Weiten oder Zeiten). Evtl hilft es dir; Soll aber nur ein Beispiel sein.
            Angehängte Dateien

            Kommentar

            Lädt...
            X