Karl Heinz: Online-Shop - Artikel-Import - Nicht möglich, weil Kategorie ID statt Kategorie Name notwendig.

Hallo,

ein Neukunde möchte gerne einen Online-Shop aufbauen. Dazu arbeitet er mit einem Dropshipper zusammen. Der Dropshipper stellt ihm eine CSV-Datei zur Verfügung, die er in seinen Online-Shop (Shopware) importieren kann. Den Import der CSV-Datei möchte er täglich automatisiert durchführen, damit die Daten im Online-Shop (Artikel-Sortiment, Bestände der Artikel usw.) immer auf dem aktuellen Stand gehalten werden. Für jeden Artikel in der CSV-Datei existiert u.a. eine Spalte, in welcher die Kategorie des Artikels angegeben ist. Die Kategorie könnte z.B. „Schuhe“ oder „T-Shirt“ sein. Bei Shopware ist es so, dass die Artikel erst dann importiert werden können, wenn die jeweiligen Artikel Kategorien bereits im Vorfeld erstellt wurden. Das ist keine große Sache, vor dem Artikel-Import haben wir einfach einen Kategorie-Import gemacht um zu gewährleisten, dass beim Artikel-Import bereits alles Kategorien vorhanden sind. Intern in Shopware hat jede Kategorie eine ID.

Wir haben nun folgendes Problem:

Beim Shopware Import ist es so, dass in der Artikel-Import-Datei die Kategorie nicht als Name angegeben werden darf, stattdessen erwartet Shopware in der Spalte Kategorie die ID der Kategorie. Wie kann man die Artikel-Import-Datei so anpassen, dass in der Spalte Kategorie statt des Namens (z.B. „Schuhe“ oder „T-Shirt“) die passende Shopware ID zur jeweiligen Kategorie vorhanden ist. Man müsste irgendwie automatisiert den Namen durch die passende Kategorie ID ersetzen, gleichzeitig soll das ganze dennoch komplett automatisiert ablaufen. Wir möchten nicht beim täglichen Import irgendwelche manuellen Anpassungen machen müssen. Das wäre ziemlich nervig. Eine Idee wie man hier vorgehen könnte?

Viele Grüße

--
"Die Deutsche Rechtschreibung ist Freeware, sprich, du kannst sie kostenlos nutzen. Allerdings ist sie nicht Open Source, d.h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."
  1. Hallo Karl Heinz,

    verwendet ihr zum Import das hier?

    Das ist quelloffen, es gibt ein Konvertierungstool - kann man damit nichts erreichen? Wenn nicht - das Ding scheint vom Shopware-Anbieter zu sein, kann man einen Feature Request kaufen?

    Ansonsten müsstest du das Import-Tool selbst anpassen oder ein Script zum Präprozessing der CSV Datei schreiben, das den Namen durch die ID ersetzt.

    Rolf

    --
    sumpsi - posui - clusi
    1. @@Rolf,

      verwendet ihr zum Import das hier?

      genau

      Das ist quelloffen, es gibt ein Konvertierungstool - kann man damit nichts erreichen?

      Das Konvertierungstool dient dazu die Spaltenbezeichnungen der CSV-Datei auf die Spaltenbezeichnungen die in der Shopware Datenbank verwendet werden zu mappen. Bei meinem Problem hilft das Konvertierungstool nicht weiter.

      Wenn nicht - das Ding scheint vom Shopware-Anbieter zu sein, kann man einen Feature Request kaufen?

      Das Ding ist tatsächlich vom Shopware-Anbieter. Was genau meinst du mit "feature Request kaufen"? Eine kostenpflichtige Anpassungprogrammieurung durch Shopware selbst?

      Ansonsten müsstest du das Import-Tool selbst anpassen

      Dazu fehlen mir leider noch die Kenntnisse.

      oder ein Script zum Präprozessing der CSV Datei schreiben, das den Namen durch die ID ersetzt.

      Das wäre wohl die beste Möglichkeit.

      Ich verstehe nicht warum Shopware hier keine Lösung von haus aus anbietet, dieses Problem tritt doch sicherlich bei vielen auf. Außerdem verstehe ich nicht welchen Sinin es macht in der Import Datei die ID der Kategorie zu erwarten, es würde doch nichts dagegen sprechen den Import auch dann zuzulassen, wenn statt der ID der Kategorie der Name der Kategorie in der Import Datei vorhanden ist. Hierzu sollte doch bestimmt eine "best practice" Lösung existieren. Ich denke ich werde mich einfach mal direkt an Shopware selbst wenden.

      1. Ich verstehe nicht warum Shopware hier keine Lösung von haus aus anbietet, dieses Problem tritt doch sicherlich bei vielen auf.

        Ja. Aber in fast so vielen Varianten wie Exemplaren. Soll heißen: Für kaum zwei Nutzer ist das Problem auf exakt die selbe Weise zu lösen. Das bedeutet wieder: ein Programm scheitert entweder in einer Vielzahl von Fällen oder ist so universell, dass es für viele unbedienbar wird. Möglichereise wird es auch sehr langsam, da es "Dinge" tut und Prüfungen vornimmt, die im konkreten Einzelfall nicht gebraucht aber abgearbeitet werden müssen. Da kann man also gleich Skripte für den Einzelfall schreiben.

        Außerdem verstehe ich nicht welchen Sinn es macht in der Import Datei die ID der Kategorie zu erwarten, es würde doch nichts dagegen sprechen den Import auch dann zuzulassen, wenn statt der ID der Kategorie der Name der Kategorie in der Import Datei vorhanden ist. Hierzu sollte doch bestimmt eine "best practice" Lösung existieren.

        Die ID der Kategorie statt die Kategorie selbst in der Waren-Tabelle aufzuführen ist "best practice". Bekannt als "zweite Normalform".

        Das Problem ist nicht nur, dass es Warenwirtschaftssysteme in allen denkbaren Geschmacksrichtungen (und einer Unmenge von Exportformaten) gibt, sondern dass es mutmaßlich aberhunderte Firmen gibt, die auch nach dem Sprung vom Kleinunternehmen zum einem solchen mit 200 Mitarbeitern mangels a) einer Risikoabschätzung und b) des Mutes zu einer Umstellung allen Ernstes (und im Hinblick auf, das mangels Wahrnehmung nicht bekannte Risiko: "äußerst mutig") die Produktion (und also die Warenwirtschaft!) mit dem "leistungsfähigem und universell einsetzbarem" Excel betreiben. Ich hätte das auch nicht geglaubt wenn ich es nicht zufällig mit eigenen Augen gesehen hätte.

        Zum "Umrubeln" würde ich die Kategorien in ein kleines Skriptlein einlesen, so dass etwas wie

        categories = [ 
          { 'Hosen' : 101 },
          { 'Jacken': 102 }
        ];
        

        entsteht und sodann die eigentliche Datentabelle hernehmen und die Kategorien entsprechend "umtauschen". Gibt es eine unbekannte Kategorie müsste man eine Entscheidung anbieten, die unbekannte Kategorie entweder in der Datenbank einzutragen (und sich die ID rausgeben zu lassen) oder aber zu einer bekannten Kategorie zu ändern. Die Daten werden ja oft von Menschen erfasst und die vertippen sich...

        Wahrscheinlich würde ich sogar gleich noch ein paar Tests oder Funktionen einbauen, nehmen wir z.B. das Umrubeln der Kodierung.

        Dann muss man sowas auch so gestalten, dass es "idiotensicher" ist. Bei (noch) nicht behebbaren Fehlern also mit den Fehlern die Rufnummer von demjenigen ausgeben, der entweder weiß was zu tun ist oder das rausfinden kann. Hin und wieder (wenn die Rufnummer mehr als 4 Stellen hat) ist dann ein Rahmenvertrag nötig.

        1. Hallo ursus,

          Die ID der Kategorie statt die Kategorie selbst in der Waren-Tabelle aufzuführen ist "best practice". Bekannt als "zweite Normalform".

          Ja, in der Datenbank. In einer Datei zum übergreifenden Datenaustausch nicht.

          Das schlagende Argument ist wohl der Umgang mit neuen Kategorien. Ein Import-Übersetzer müsste in zwei Schritten arbeiten: Erstens die vorgefundenen Kategorien der CSV-Datei gegen die DB prüfen und dabei IDs und unbekannte Kategorien sammeln. Wenn's unbekannte Kategorien gibt, ist der 2. Schritt deren Anzeige und Abbruch des Imports. Wenn nicht, ist der 2. Schritt die Übersetzung in IDs und Import.

          Einfach mal loslegen und bei unbekannten Kategorien abbrechen wäre blöd, dann hat man einen Teilimport. Mit Pech oder Ungeschick produziert man so beim Fortsetzen Doubletten in der DB.

          Unbekannte Kategorien einfach als Stub anlegen ist auch gefährlich, man updated die DB einer anderen Software nur dann, wenn man ganz genau weiß was man tut.

          Rolf

          --
          sumpsi - posui - clusi
          1. Ein Import-Übersetzer müsste in zwei Schritten arbeiten: Erstens die vorgefundenen Kategorien der CSV-Datei gegen die DB prüfen und dabei IDs und unbekannte Kategorien sammeln.

            Also, der Webshop, den ich vor vielen Jahren (2003?) mal gemacht habe, der hatte eine Importprüfung, die wirklich "jeden Scheiß" geprüft hat - Auch die Kategorien. Ausführliches Log für jeden Fehler, Import nur wenn alles sauber war...

  2. Man müsste irgendwie automatisiert den Namen durch die passende Kategorie ID ersetzen, gleichzeitig soll das ganze dennoch komplett automatisiert ablaufen

    Produkte.csv

    Jacken Lederjacke 150.00
    Jacken Regenjacke 90.00
    Hosen Lederhosen 150.00
    Schuhe Lederschuhe 90.00
    Schuhe Seglerschuhe 250.00
    

    Kategorien.csv

    1 Schuhe
    2 Jacken
    3 Hosen
    

    Produkte.awk

    {
    command="grep ' "$1"' Kategorien.csv | cut -d ' ' -f1";
    command| getline result
    print result" "$2" "$3;
    }
    

    Kommando:

    awk -F" " -f Produkte.awk Produkte.csv > transformed.csv
    

    Ergebnis (in transformed.csv):

    2 Lederjacke 150.00
    2 Regenjacke 90.00
    3 Lederhosen 150.00
    1 Lederschuhe 90.00
    1 Seglerschuhe 250.00
    

    Mit "richtigen" Programmiersprachen sollte das auch (und für manchen Geschmack: "einfacher") zu bewerkstelligen sein.

    1. Hallo ursus,

      Hosen "Hose mit Knieschutz" 137.99
      

      Oder, wenn Du CSV wörtlich nimmst:

      Hosen,"Hose, grün",37.42
      

      awk ist sehr passend benannt.

      Einfaches CSV geht, für CSV mit Anführungszeichen ist es nicht gemacht. Man kann was ins awk-File hineinscripten, aber dann ist es kein Dreizeiler mehr.

      Wie wär's mit Commandline-PHP, der fgetcsv und fputcsv-Funktion und einem integrierten DB-Zugriff?

      Rolf

      --
      sumpsi - posui - clusi
      1. Einfaches CSV geht, für CSV mit Anführungszeichen ist es nicht gemacht.

        Mit ein wenig Salz sed dazu geht viel :-)

        aber dann ist es kein Dreizeiler mehr.

        Naja. Für die Demo, was man kann, ist ein Dreizeiler keine so schlechte Idee.

        Wie wär's mit Commandline-PHP, der fgetcsv und fputcsv-Funktion und einem integrierten DB-Zugriff?

        Oder join. Oder einer temporären Tabelle in der Datenbank, die man dann mit einer kitzekleinen Abfrage bearbeitet und die Resulate des simplen SQL-Joins in die eigentliche Tabelle schreibt. Ich kann das auch in Excel - will aber nicht alles kostenlos verraten. Mit solchen Importen und Exporten verdiene ich manchmal mein Geld.

        CSV wörtlich

        comma character separated values