Erstellung eines CSV-Importers

Im folgenden wird erklärt wie eine CSV-Datei per Kommandozeile eingelesen werden kann. Die Dateien müssen im /import/ liegen.

Kopf des Scripts

Damit das Script auf die wawi-Funktionen zugreifen kann müssen ein paar Daten geladen werden dies geschieht mit folgendem Code:
<?php
// Nur einfache Fehler melden
error_reporting(E_ERROR | E_WARNING | E_PARSE);

include_once("../conf/main.conf.php");
include_once("../phpwf/plugins/class.mysql.php");
include_once("../phpwf/plugins/class.string.php");
include_once("../phpwf/plugins/class.user.php");
include_once("../www/lib/class.erpapi.php");

class app_t {
  var $DB;
  var $String;
  var $User;
}

$app = new app_t();
$app->User = new User($app);
$conf = new Config();
$app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass);
$app->String = new String();
$erp = new erpAPI($app);
$app->erp = $erp;

Parameter übergeben

Wird in der Konsole ein Script aufgerufen mitphp script.php Datei werden die Parameter in das Array $argv gespeichert. Sinnvoll ist es zu prüfen ob ein Parameter gegeben ist und ob die angegebene Datei existiert.
if(!isset($argv[1]))
{
  die("Keine Datei zum Import angegeben");
}
if(!file_exists($argv[1]))
{
  die("Datei ".$argv[1]." existiert nicht");
}
if(!is_file($argv[1]))
{
  die($argv[1]." ist keine Datei");
}

Einlesen der Datei

ich habe es mir angewöhnt eine eigene Klasse zu erstellen und die Datei dort zu verarbeiten.

$csvimport = new CSVImport($app, $argv[1]);


class CSVImport
{
  var $app;
  var $Datei;

  function __construct(&$app, $Datei)
  {
    $this->app = $app;
    $this->Datei = $Datei;

  }

  function read()
  {
    if($this->Datei && file_exists($this->Datei) && is_file($this->Datei))
    {
      if (($handle = fopen($this->Datei, "r")) !== FALSE) {
        $row = 0;
        while (($csv = fgetcsv($handle, 0, ";")) !== FALSE) {
          //$line = iconv("ISO-8859-1","UTF-8", $line); //Falls Script in UTF-8 und CSV in ANSI gespeichert ist wird der String umgewandelt
          foreach($csv as $k => $el)$csv[$k] = iconv("ISO-8859-1","UTF-8", $el);
          $row++;
          //$csv = str_getcsv($line, "\t","\""); //Wenn CSV mit Tab getrennt und einzelne Elemente mit " umschlossen sind
          //$csv = str_getcsv($line, ";",""); //mit ; getrennt
          if($row < 5) { //Falls der Kopf der Datei 4 Zeilen hat kann man dies z.B. zum Debuggen verarbeiten 
          
          } else {
            //Ab hier werden die eigentlichen Daten verarbeitet
            $this->verarbeite($csv);
          
          
          }
        }
      }
    } else {
      return false;
    }
  }
  function verarbeite(&$csv)
  {
    //Verarbeiten der einzelnen Daten
    ...
  }
}

Verarbeiten der Daten mit Wawifunktionen

die erpAPI-Klasse bietet viele Funktionen zum Import der DatenBeispiel zum Import von Artikeln
  function verarbeite(&$csv)
  {
    
      //Verarbeiten der einzelnen Daten
      if($csv[30])
      {
      
      $data['nummer'] = $csv[2]; //Falls Artikelnummer 3. Spalte ist
      $data['name_de'] = $csv[0]; //Falls Artikelname in der ersten Spalte ist
      $data['kurztext_de'] = $csv[22];
      /*$data['beschreibung_de'] = ....
      $data['hersteller'] = ...
      $data['herstellerlink'] = ...*/
      $data['gewicht'] = $csv[48];
      if($scv[32] == 'D1')$data['umsatzsteuer'] = 'ermaessigt';
   
      //Daten werden mit der erpAPI gespeichert
      $artikelid = true;
      $artikelid = $this->app->erp->InsertUpdateArtikel($data);

      //Nun die Verkaufspreise
      $preisbrutto = $csv[30];
      $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100);
      //print_r($data);
      //echo $nettopreis;
      $this->app->erp->AddVerkaufspreis($artikelid,1,0,$nettopreis);
    }
    if($csv[31])
    {
      //Downloadartikel
      $data2['nummer'] = $csv[2].'D'; //Falls Artikelnummer 3. Spalte ist
      $data2['name_de'] = $csv[0].' Download'; //Falls Artikelname in der ersten Spalte ist
      $data2['kurztext_de'] = $csv[22];
      /*$data['beschreibung_de'] = ....
      $data['hersteller'] = ...
      $data['herstellerlink'] = ...*/
      if($scv[32] == 'D1')$data2['umsatzsteuer'] = 'ermaessigt';
      if(isset($artikelid))
      {
        $data2['variante'] = 1;
        $data2['variante_von'] = $artikelid;
      }
      $artikelid2 = $this->app->erp->InsertUpdateArtikel($data2);
      $preisbrutto = $csv[31];
      $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100);
      //print_r($data2);
      //echo $nettopreis;
      $this->app->erp->AddVerkaufspreis($artikelid2,1,0,$nettopreis);
    } 
  }

Gesamte Datei

<code php aco_musik_artikel.php> <?php Nur einfache Fehler melden error_reporting(E_ERROR | E_WARNING | E_PARSE); include_once("../conf/main.conf.php");include_once("../phpwf/plugins/class.mysql.php"); include_once("../phpwf/plugins/class.string.php"); include_once("../phpwf/plugins/class.user.php"); include_once("../www/lib/class.erpapi.php"); class app_t { var $DB; var $String; var $User; } $app = new app_t();$app->User = new User($app); $conf = new Config(); $app->DB = new DB($conf->WFdbhost,$conf->WFdbname,$conf->WFdbuser,$conf->WFdbpass); $app->String = new String(); $erp = new erpAPI($app); $app->erp = $erp; if(!isset($argv[1])){ die("Keine Datei zum Import angegeben"); } if(!file_exists($argv[1])) { die("Datei ".$argv[1]." existiert nicht"); } if(!is_file($argv[1])) { die($argv[1]." ist keine Datei"); } $csvimport = new CSVImport($app, $argv[1]);$csvimport->read(); class CSVImport{ var $app; var $Datei; function construct(&$app, $Datei) { $this->app = $app; $this->Datei = $Datei; } function read() { if($this->Datei && file_exists($this->Datei) && is_file($this->Datei)) { if (($handle = fopen($this->Datei, "r")) !== FALSE) { $row = 0; while (($csv = fgetcsv($handle, 0, ";")) !== FALSE) { $line = iconv("ISO-8859-1","UTF-8", $line); Falls Script in UTF-8 und CSV in ANSI gespeichert ist wird der String umgewandelt foreach($csv as $k => $el)$csv[$k] = iconv("ISO-8859-1","UTF-8", $el); $row++; $csv = str_getcsv($line, "\t","\""); Wenn CSV mit Tab getrennt und einzelne Elemente mit " umschlossen sind $csv = str_getcsv($line, ";",""); mit ; getrennt if($row < 5) { Falls der Kopf der Datei 4 Zeilen hat kann man dies z.B. zum Debuggen verarbeiten } else { Ab hier werden die eigentlichen Daten verarbeitet $this->verarbeite($csv); } } return true; } else die("Konnte Datei ".$this->Datei." nicht oeffnen!\r\n"); } else { echo $this->Datei." nicht gefunden\r\n"; return false; } } function verarbeite(&$csv) { Verarbeiten der einzelnen Daten if($csv[30]) { $data['nummer'] = $csv[2]; Falls Artikelnummer 3. Spalte ist $data['name_de'] = $csv[0]; Falls Artikelname in der ersten Spalte ist $data['kurztext_de'] = $csv[22]; /*$data['beschreibung_de'] = .... $data['hersteller'] = ... $data['herstellerlink'] = ...*/ $data['gewicht'] = $csv[48]; if($scv[32] == 'D1')$data['umsatzsteuer'] = 'ermaessigt'; Daten werden mit der erpAPI gespeichert $artikelid = true; $artikelid = $this->app->erp->InsertUpdateArtikel($data); Nun die Verkaufspreise $preisbrutto = $csv[30]; $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100); print_r($data); echo $nettopreis; $this->app->erp->AddVerkaufspreis($artikelid,1,0,$nettopreis); } if($csv[31]) { Downloadartikel $data2['nummer'] = $csv[2].'D'; Falls Artikelnummer 3. Spalte ist $data2['name_de'] = $csv[0].' Download'; Falls Artikelname in der ersten Spalte ist $data2['kurztext_de'] = $csv[22]; /*$data['beschreibung_de'] = .... $data['hersteller'] = ... $data['herstellerlink'] = ...*/ if($scv[32] == 'D1')$data2['umsatzsteuer'] = 'ermaessigt'; if(isset($artikelid)) { $data2['variante'] = 1; $data2['variante_von'] = $artikelid; } $artikelid2 = $this->app->erp->InsertUpdateArtikel($data2); $preisbrutto = $csv[31]; $nettopreis = $preisbrutto / (1+($scv[32]=='D1'?7:19)/100); print_r($data2); echo $nettopreis; $this->app->erp->AddVerkaufspreis($artikelid2,1,0,$nettopreis); } }} </code>

Import Datei einmalig ausführen

Die Datei welche die CSV Datei verarbeitet (.php Datei), muss im Xentrals Ordner in den Ordner importer. Hier werden auch die benötigten CSV Dateien zum Verarbeiten abgelegt. In diesem Beispiel ist die PHP Datei beispielimporter.php und die CSV Datei beispieldaten.csv. Im Anschluss wird die Konsole aufgerufen und in den importer Ordner gewechselt, z.B. mit cd /var/www/html/wawision/importer Der Pfad kann je nachdem wie Sie ihre Verzeichnisstruktur aufgebaut haben abweichen. Mit php beispielimporter.php beispieldaten.csv wird die PHP Datei aufgerufen und der Code darin ausgeführt. Die Dateinamen müssen Sie durch Ihre jeweiligen Dateinamen ersetzen. Es kann sein, dass ein Typ angegeben werden muss, hier wird die Konsole jedoch sie darauf aufmerksam machen und Ihnen die möglichen Typen nennen. Dann erfolgt der Aufruf mit php beispielimporter.php beispieltyp beispieldaten.csv Je nach Dateigröße der CSV Datei kann der Ablauf mehrere Minuten in Anspruch nehmen. Der Code wurde komplett ausgeführt, wenn Sie in der Kommandozeile wieder Ihren Benutzernamen und Pfad in einer neuen Zeile sehen.

Import Datei mehrmals manuell ausführen

Die Datei welche die CSV Datei verarbeitet (.php Datei), muss im Xentrals Ordner in den Ordner importer. Hier werden auch die benötigten CSV Dateien zum Verarbeiten abgelegt. In diesem Beispiel ist die PHP Datei beispielimporter.php und die CSV Datei beispieldaten.csv. Im Anschluss wird die Konsole aufgerufen und in den importer Ordner gewechselt, z.B. mit cd /var/www/html/wawision/importer Der Pfad kann je nachdem wie Sie ihre Verzeichnisstruktur aufgebaut haben abweichen. Mit php beispielimporter.php wird die PHP Datei aufgerufen und der Code darin ausgeführt. Den Dateinamen müssen Sie durch Ihren jeweiligen Dateinamen ersetzen. Je nach Dateigröße der CSV Datei kann der Ablauf mehrere Minuten in Anspruch nehmen. Der Code wurde komplett ausgeführt, wenn Sie in der Kommandozeile wieder Ihren Benutzernamen und Pfad in einer neuen Zeile sehen.
War der Artikel hilfreich?
Vielen Dank für Ihr Feedback!

Made with ❤ at zwetschke.de