Bernd: CSV Import

Hallo,

ich habe eine CSV Datei, diese hat folgenden Inhalt

"1;;Test Eintrag, weiß;weiß;Tisch-Rund, weiß 04/01/001;0,5;0,55;1,1;49;;15;L1;;;20;;;;;;"

Diese möchte ich über den phpMyAdmin einspielen

Wenn ich diesen ausführe, erhalte ich folgende Meldung

Allerdings es ist nichts in der Datenbank. Wo landen die Einträge? Oder mache ich irgendetwas falsch?

  1. Eine CSV Datei -- Eine Tabelle. Suche die Tabelle!

    1. Ich bin ja schon in der Tabelle und sage dort importieren. Fehlermeldung erhalte ich keine nur der Datensatz taucht nicht auf.🧐

  2. Hallo Bernd,

    Fehlermeldung erhalte ich keine

    Aber auch keine Erfolgsmeldung. "0 Zeilen importiert" ist irgendwie verdächtig.

    Hat die Zeile der CSV Datei ein Anführungszeichen ganz am Anfang und am Ende der Zeile, und sonst nirgends? In dem Fall wäre diese Zeile ein einziger String, weil Du ja „Spalten eingeschlossen mit: " “ angegeben hast.

    Ich hätte allerdings einen Fehler erwartet, dass "1;;Test Eintrag, weiß;weiß;Tisch-Rund, weiß 04/01/001;0,5;0,55;1,1;49;;15;L1;;;20;;;;;;" nicht numerisch ist (vermutlich ist die 1 deine ID). Oder dass die CSV Datei nicht soviele Spalten hat wie die DB.

    Ist ein Zeilenumbruch am Ende der Zeile? Möglicherweise verwirrt ihn das. Ich weiß nicht wie sensibel phpMyAdmin da ist.

    Irgendwas ist faul im Staate Berndemark. Was - das ist im Moment schwer zu sagen.

    Rolf

    -- sumpsi - posui - clusi
    1. Ich würd sagen, wenn die Daten nicht ankommen und kein Fehler gemeldet wurde, ist die Anwendung unbrauchbar.

      1. Hallo pl,

        ok. Stelle uns deine Alternative zu phpMyAdmin vor.

        Rolf

        -- sumpsi - posui - clusi
        1. Ich mache sowas auf der Kommandozeile!

          1. Hallo pl,

            du hostest die DB ja auch in deiner eigenen Hosentasche. :)

            Frage ist, ob Bernd das auch tut. Ein Webspace-Hoster hustet dir was, wenn Du remote direkt an der DB rumgrabbeln willst.

            Rolf

            -- sumpsi - posui - clusi
            1. Frage ist, ob Bernd das auch tut. Ein Webspace-Hoster hustet dir was, wenn Du remote direkt an der DB rumgrabbeln willst.

              Ich rede ja auch von HTTP und RPC.

            2. Hallo,

              nein, ich habe kein Server sondern nur ein Webspace bei all-inkl. Ein eigener Server trau ich mich nicht zu, dieser muss ständig aktuell gehalten werden usw.

  3. Hallo,

    Oder mache ich irgendetwas falsch?

    Auf jeden Fall ists flasch, zu behaupten, die Spalten wären in „"“ eingeschlossen, wenn sie es offensichtlich nich sind…

    Gruß
    Kalk

    1. Tach!

      Auf jeden Fall ists flasch, zu behaupten, die Spalten wären in „"“ eingeschlossen, wenn sie es offensichtlich nich sind…

      Nein, das ist kein Fehler, denn das Einschließen ist optional und nur nötig, wenn Datensatzbegrenzer (Zeilenumbrüche) oder die Feldtrenner (hier Semikolon) als Bestandteil eines Wertes vorkommt.

      dedlfix.

  4. Idee: Füg mal die Spaltenüberschriften der CSV Datei hinzu und probiers nochmal.

  5. Vermutlich willst Du:

    1;;"Test Eintrag, weiß";"weiß";"Tisch-Rund, weiß 04/01/001";0.5;0,55;1,1;49;;15;"L1";;;20;;;;;;

    (Eine Zeile)

    denn bei Deinem scheinbar falschen:

    "1;;Test Eintrag, weiß;weiß;Tisch-Rund, weiß 04/01/001;0,5;0,55;1,1;49;;15;L1;;;20;;;;;;"

    wird versucht, alles (durch die umschließenden Quotas als eine Spalte formuliert) in die erste Spalte einzutragen - und deren Datentyp ist vermutlich auf einen der Integer-Typen gesetzt. Ferner kann es noch fehlschlagen, wenn die erste Spalte ein autoindex und also unique ist. Die 1 ein zweites mal einzutragen geht da nicht, es sei denn Du erstetzt den Inhalt. Das hast Du aber nicht ausgewählt.

    Es sei denn, Deine Tabelle hat nur eine Spalte für Text… in welche wirklich alles hinein soll.

    Ferner ist ein Punkt der Dezimaltrenner und bitte überprüfe ob da Kommas sind, welche Spaltentrenner, also Semikolons sein sollten.

    Kurz gesagt: Dein "CSV" ist bestenfalls verwirrend und der Computer zu doof um zu wissen was Du willst. Also macht er, was Du ihm aufträgst. Genauer: Er versucht es.

    Erinnert mich daran, dass mir bei der ostzonalen NVA mal ein Uffz (um seinen Rang zu beweisen) befohlen hat: "Alles Gras rupfen!" Ich hab den Klee stehen lassen. Es war fast nur Klee…

    1. Erinnert mich daran, dass mir bei der ostzonalen NVA mal ein Uffz

      Zeit für: UvD bei der NVA 😉

  6. Hi there,

    mit Deiner Verwendung des "-Zeichens hast Du die Reihe eingeschlossen, nicht die Spalten. "1;;xxxx;yyyy;zzz;25" ist keine gültige CSV-Reihe - entweder Du schließt alle Spalten in Hochkommata ein (je nach Importierschnittstelle kann man die manchmal bei Zahlen weglassen) oder keine. Auf keinen Fall aber kann man den Inhalt einer ganzen Reihe in Hochkommata einschliessen, so wie Du es getan hast.…

    1. Hallo,

      Auf keinen Fall aber kann man den Inhalt einer ganzen Reihe in Hochkommata einschliessen, so wie Du es getan hast.…

      Dochdoch, wie dedlfix bereits mitteilte, kann das gar nicht der Fehler sein…

      Gruß
      Kalk

      1. Tach!

        Auf keinen Fall aber kann man den Inhalt einer ganzen Reihe in Hochkommata einschliessen, so wie Du es getan hast.…

        Dochdoch, wie dedlfix bereits mitteilte, kann das gar nicht der Fehler sein…

        Dass die gesamte Zeile eingeschlossen war, hatte ich nicht gesehen. Ansonsten steht es aber so im Standard, dass die Zellen nicht eingerahmt sein müssen, solange kein Feld- oder Zeilentrenner drin vorkommt.

        dedlfix.

        1. Hallo,

          Dass die gesamte Zeile eingeschlossen war, hatte ich nicht gesehen.

          Dass im gezeigten Dialog explizit Spalteneinrahmung angehakt ist, hast du dann vermutlich auch nicht gesehen…

          Ansonsten steht es aber so im Standard, dass die Zellen nicht eingerahmt sein müssen, solange kein Feld- oder Zeilentrenner drin vorkommt.

          Um den Standard, also den allgemeinen Fall gehts aber grad nicht, sondern um sein spezielles Problem.

          Gruß
          Kalk

          1. Tach!

            Dass die gesamte Zeile eingeschlossen war, hatte ich nicht gesehen.

            Dass im gezeigten Dialog explizit Spalteneinrahmung angehakt ist, hast du dann vermutlich auch nicht gesehen…

            Doch, das hab ich gesehen. Und das ist auch richtig so, denn wenn optional die Spalten eingerahmt sind, dann muss das mit dem Zeichen geschehen, das dort angegeben ist. Oder andersrum, dann muss dort das verwendete Zeichen konfiguriert sein. Das heißt nicht, dass das Einrahmen damit zur Pflicht geworden ist.

            dedlfix.

      2. Hi there,

        Hallo,

        Auf keinen Fall aber kann man den Inhalt einer ganzen Reihe in Hochkommata einschliessen, so wie Du es getan hast.…

        Dochdoch, wie dedlfix bereits mitteilte, kann das gar nicht der Fehler sein…

        Hm? Hat er nicht mitgeteilt, und ich vermute nichtsdestotrotz, daß das (unter anderem) der Grund ist, warum der Import nicht funktioniert. Versuch einmal eine CSV-Datei irgendwo einzulesen, wo jede Reihe (und nur die Reihe) in einen Begrenzer eingeschlossen ist...

  7. Hallo,

    hier mal zwei Screenshots. Vielleicht mache ich ja etwas beim exportieren falsch?

    Dieses ist meine Datei

    Wenn ich dann in Excel auf speichern klicke erhalte ich folgende Auswahl, welchen CSV sollte ich hier nehmen?

    1. Warum der Umweg über CSV?

      1. Warum der Umweg über CSV?

        Weil ich keine Excel Datei in phpMyAdmin einspielen kann?

        1. Warum der Umweg über CSV?

          Weil ich keine Excel Datei in phpMyAdmin einspielen kann?

          Warum Excel nicht gleich mit PHP auslesen? Auf ein Array, das wird serialisiert, von mir aus JSON, zum Webserver gesendet und dort per PHP in MySQL eingebaut. Das ist doch die einfachste Sache der Welt.

          1. Das ist doch die einfachste Sache der Welt.

            Für dich vielleicht ;)

            Warum Excel nicht gleich mit PHP auslesen? Auf ein Array, das wird serialisiert, von mir aus JSON, zum Webserver gesendet und dort per PHP in MySQL eingebaut.

            Ich muss schauen wie ich mit PHP eine Excel Datei einlesen kann. Ist dieses wirklich besser als eine CSV Datei zu erzeugen?

            1. Natürlich ist das besser: So weißt Du weningstens was Du tust.

              1. CSV Import

                ursus contionabundo
                +2

                Ich muss schauen wie ich mit PHP eine Excel Datei einlesen kann. Ist dieses wirklich besser als eine CSV Datei zu erzeugen?

                Natürlich ist das besser: So weißt Du wenigstens was Du tust.

                Da bin ich mir nicht so sicher. Gründe:

                1. Die Entwickler entsprechender Libs für den Import/Export von Excel-Dateien geben geradezu regelmäßig auf.

                2. Im Gegensatz zu CSV, welches in vergleichbar gut definierter Form nur die Daten eines "Tabellenblattes" (was schon von einer "Tabelle" zu unterscheiden ist) enthält, enthalten die Excel-Dateien mehrere Tabellenblätter. Und jede Menge Zeug (Formeln, Formatierungen) welches nachfolgend gar nicht in die Datenbank soll. Ich denke, mit dem Export und Import von CSV weiß man genauer, was man tut.

                3. Microsoft kennt die Internas seines Stuffs und liefert mit Excel zusammen einen Exporter, der recht ordentlich funktioniert. Man kann sich das Resultat auch noch mit einem Text-Editor ansehen und sogar in Excel öffnen um es nicht nur zu bestaunen, sondern auch zu prüfen, ob es den Erwartungen entspricht.

                4. Just das CSV-Zeug, welches mit Microsofts CSV-Export exportiert wird, lässt sich sehr zuverlässig in MySQL importieren. Die Voreinstellungen des Imports via PhpMyAdmin entsprechen, soweit ich das noch weiß, denen des Exports aus Excel. Das ist also auch noch bequem.

                1. Freilich doch, wer gerne klickt darf das selbstverständlich auch weiterhin tun.

                  Die Entwickler entsprechender Libs für den Import/Export von Excel-Dateien geben geradezu regelmäßig auf.

                  Wer aufgibt hat die Bezeichnung Entwickler ganz sicher nicht verdient. Der sollte besser beim Klicken bleiben!

                  1. Wer aufgibt hat die Bezeichnung Entwickler ganz sicher nicht verdient.

                    Soso. Weißt Du, wie aufwendig und teuer es werden kann bei jeder Veränderung von Excel und PHP eine derartig komplizierte lib an das undokumentierte Zeug von Microsoft anzupassen? Die haben nicht umsonst ausgerechnet 2015 aufgegeben…

                    Außerdem hilft das dem TO nicht weiter, wenn Du ihn erst auf diesen Pfad führst und ihn dann mit diesem Spruch stehen lässt.

                    Freilich doch, wer gerne klickt darf das selbstverständlich auch weiterhin tun.

                    Ja toll. Der Umstieg auf eine alternative lib ist aber keine Lösung. Grund: Gerade solche Sachen sollen jahrelang funktionieren und der Austausch der lib ist kein Kinderspiel, sondern faktisch ein "Neuschrieb" mit allen Folgen: Tests, Tests, Tests.

                    Da ist es wesentlich besser bei dem vergleichbar primitiven Datenformat csv zu bleiben. Jedenfalls bis M$ einen JSON-Export bringt...

                    1. Warum sollte ausgerechnet JSON eine Lösung sein? application/json definiert einen Algorithmus aber nicht eine bestimmte Datenstrukur! So kann ein JSON String ein Array transportieren oder aber auch ein Array of Arrays. Oder auch assoziative Arrays, Strings und alles zusammen beliebig geschachtelt.

                      Da muss man schon ein bischen mehr vereinbaren wenn es darum geht komplexe Datenstrukturen portable zu machen application/json allein reicht da nicht.

                      Genausowenig wie text/csv reicht wenn keine Feldnamen drinstehen.

                      1. Da muss man schon ein bischen mehr vereinbaren wenn es darum geht komplexe Datenstrukturen portable zu machen application/json allein reicht da nicht.

                        Das ist bei CSV ebenso. Nur muss man da auch noch mindestens Kodierung, Zeilen- und Feldtrenner, Stringbegrenzer und Maskierungszeichen für denselben, eventuell noch das Auslassen der n ersten Zeilen vereinbaren (Falls da Kommentare oder, wie von Dir genannt, die Feldnamen drin stehen.)

                        Das ist bei json schon mal nicht nötig (UTF-8 ist default). Ein "Array of Hashes" (um bei der „perligen“ Nomenklatur zu bleiben) genügt für den Ex- und Import von Daten in und aus zweidimensionalen Datentabellen (oder zweidimensional "abgebildeten" Datenräumen).

                        Freilich kann man hingehen und eine Datenstruktur vereinbaren, mit der man das komplette Anlegen der Datenbank, der Tabellen und die Daten selbst beschreiben kann...

            2. Aloha ;)

              Ich muss schauen wie ich mit PHP eine Excel Datei einlesen kann. Ist dieses wirklich besser als eine CSV Datei zu erzeugen?

              Unter der Voraussetzung, dass die Empfehlung a) von pl kommt und b) dir spanisch vorkommt, dann besteht eine über 90%ige Wahrscheinlichkeit, dass sie Murks ist.

              Ich spreche aus Erfahrung.

              Was nicht heißen soll, dass pl nur Murks erzählt. Was aber heißen soll, dass das, was sich bei ihm wie Murks anhört, auch Murks ist.

              Grüße,

              RIDER

              -- Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller

              # Twitter # Steam # YouTube # Self-Wiki #

              Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
    2. Tach!

      Wenn ich dann in Excel auf speichern klicke erhalte ich folgende Auswahl, welchen CSV sollte ich hier nehmen?

      Das erste. Zur Not auch das zweite. Wenn du allerdings ein Ergebnis bekommst, bei dem die komplette Zeile in Anführungszeichen steht, dann machst du was falsch. An Excel wird es nicht liegen, das wäre schon als großes Desaster aufgefallen.

      dedlfix.

      1. Hallo,

        ok, habe ich so gemacht. Wenn ich jetzt den Import starte erhalte ich folgende Meldung

        Ungültige Anzahl an Spalten im CSV-Import in Zeile 1.

        Ich bekomme die Datei einfach nicht importiert. Keine Ahnung was ich noch machen soll. Jetzt sieht der Export so aus

        ai_id;ai_code;ai_artikelid;ai_titel;ai_farbe;ai_beschreibung;ai_b;ai_t;ai_h;ai_preis;ai_status;ai_gewicht;ai_lagerplatz;ai_titelzusatz;ai_kategorie;ai_anzahl;;;;;; ;1;;Test 1;weiß;Test , weiß 04/01/001;0,5;0,55;1,1;49;;15;D1;;;20;;;;;; ;2;;Test 2;weiß;Test, weiß 04/01/002;0,5;0,5;1,1;49;;38;D1;;;16;;;;;;

        (~~~ eingefügt von Rolf B, Leerzeile nach Spaltenüberschriften eingefügt vom Forum)

        Die ai_id wird von der Datenbank selbst hochgezählt.

        1. Tach!

          Ungültige Anzahl an Spalten im CSV-Import in Zeile 1.

          Ich bekomme die Datei einfach nicht importiert.

          Interessanter wäre die Information gewesen, ob die Anzahl der Spalten in der CSV mit der Tabelle übereinstimmt oder nicht.

          Keine Ahnung was ich noch machen soll.

          Du kannst ja erstmal einen Import im Kleinen probieren. Eine Testtabelle mit übersichtlichen drei Spalten anlegen und eine Excel mit ebensoviel verwendeten Spalten nach CSV exportieren, und schauen ob das geht.

          dedlfix.

          1. Hallo,

            Interessanter wäre die Information gewesen, ob die Anzahl der Spalten in der CSV mit der Tabelle übereinstimmt oder nicht.

            die Spalten sind exakt die, die ich auch in der Datenbank habe.

            Du kannst ja erstmal einen Import im Kleinen probieren. Eine Testtabelle mit übersichtlichen drei Spalten anlegen und eine Excel mit ebensoviel verwendeten Spalten nach CSV exportieren, und schauen ob das geht.

            Ich habe eine Test Datei mit zwei Artikel angelegt und wollte diese importieren. Funktioniert leider nicht.

            1. Tach!

              Ich habe eine Test Datei mit zwei Artikel angelegt und wollte diese importieren. Funktioniert leider nicht.

              Bei "funktioniert nicht" kann ich dir ganz genau das Problem sagen: Es liegt an der Ursache.

              Hab grad mit 3 Spalten probiert, eine davon Auto-Increment und in der CSV leer, und hatte kein Problem beim Importieren.

              dedlfix.

        2. Wenn ich jetzt den Import starte erhalte ich folgende Meldung

          Ungültige Anzahl an Spalten im CSV-Import in Zeile 1.

          Das nenn ich mal eine klare Fehlermeldung!

          <?php ### Schnelles Skript für die Überprüfung: $rowDelim = "\r\n"; $colDelim = ';'; $myRowEnd = "\n"; # Unix-Konsole: "\n" | Windows-Terminal: "\r\n" | Browser "<br>"; $rows = file_get_contents('Excel.csv'); $rows = explode($rowDelim, $rows); $counter = 0; foreach ( $rows as $row ) { $arItems = explode( $colDelim, $row ); echo "Zeile " . ++$counter . ' hat ' . count( $arItems ) . ' Spalten.' . $myRowEnd; }

          Vergleiche das Ergebnis mit Deinen Erwartungen, die sich mit

          SHOW CREATE TABLE tabelle\G

          manifestieren bzw. korrigieren lassen.

    3. CSV Import

      ursus contionabundo

      CSV Trennzeichen getrennt oder Text (Da ist stets das TAB das Trennzeichen zwischen den Items) sollten das sein, was Du suchst.

      "Macintosh" und "MS-DOS" betreffen nur das Zeilenende ("\r" oder "\r\n").

      Bleibt die Frage, ob "Unicode-Text" ideal ist. Was soll denn in der Datenbank landen? Wie ist die Tabelle angelegt?

      SHOW CREATE TABLE `tabelle`\G

      gibt Dir umfassend Auskunft

      1. Hallo,

        Da ist stets das TAB das Trennzeichen zwischen den Items

        sicher?

        Gruß
        Kalk

        1. sicher?

          ursus contionabundo

          Da ist stets das TAB das Trennzeichen zwischen den Items

          sicher?

          Na jedenfalls beschreibt Microsoft das so für das Export-Format "Text". CSV ist explizit aufgeführt.

          sicher?

          Nach dem Oktober-Update waren längst nicht nur Tabs, Kommas und Semikolons weg. Wie sollte man sich da bei Microsoft auch nur in irgendeiner Frage sicher sein?