Datenverarbeitung CSV dateien

mr-otin

Mitglied
Hallo Gemeinde,

Ich benötige einen Denkanstoss zu folgender Problematik:

Zur zeit liegt mir eine bsp.csv Datei vor, die per Importscript in die DB geschrieben wird. Nach dem erfolgreichen Import wird diese umbenannt in bsp.erl. Jetzt soll das ganze nicht nur mit einer CSV Datei geschehen sondern mit 5! Dazu habe ich mir einen Ordner angelegt und dort diese 5 Dateien reinkopiert. Per Script lese ich diesen Ordner mit den Dateien in einen Array hinein:

PHP:
<?php
$verzeichnis = "import/";
// Text, ob ein Verzeichnis angegeben wurde
if ( is_dir ( $verzeichnis ))
{
    // öffnen des Verzeichnisses
    if ( $handle = opendir($verzeichnis) )
    {
        // einlesen des Verzeichnis
        while (($file = readdir($handle)) !== false)
        {
            echo $file."<br />";
        }
        closedir($handle);		
    }
}
?>

Wie bekomme ich es hin das er alle 5 CSV Dateien aus dem Array nacheinander in die Tabelle der DB schreibt?
Code der Ausgführt wird zum importieren einer CSV Datei wäre dieser:

PHP:
<?php
$file = file('glx.csv');

foreach($file as $fh)
{
  $info = explode(";", $fh);
  $Lieferscheinnr = $info[0];
  $Name1 = $info[1];
  $Name2 = $info[2];
  $Street = $info[4];
  $Kundennr = $info[5];
  $LKZ = $info[6];
  $plz = $info[7];
  $Ort = $info[8];
  $Liefer_po = $info[9];
  $Gewicht = $info[10];
  $EMail = $info[11];
  $Bez1 = $info[12];
  $Bez2 = $info[13];
  $BestellMenge = $info[14];
  $Tel = $info[15];
  $Fax = $info[16];
  $Bestellnummer = $info[20];
  $Lagerort = $info[26];
  $ident = $info[29];
  $ident = str_replace(" ", "", $ident);
  $ident = str_replace("\r", "", $ident);
  $ident = str_replace("\n", "", $ident);
  $sql = "SELECT 
				ean, herstnr 
		   FROM 
				stammdaten 
		   WHERE
		    Ident = '".$ident."'";
  echo $sql;
	$res = mysql_query($sql);
	$dsatz = mysql_fetch_assoc($res);

$ean = $dsatz['ean']; // augelesener wert aus Stammdaten
$herstnr = $dsatz['herstnr']; // augelesener wert aus Stammdaten

   $insert= "INSERT INTO gls
						(
							Lieferscheinnr,
							Name1,
							Name2,
							Street,
							Kundennr,
							LKZ,
							PLZ,
							Ort,
							Liefer_po,
							Gewicht,
							Mail,
							Bez1,
							Bez2,
							BestellMenge,
							Tel,
							Fax,
							Bestellnummer,
							Lagerort,
							Ident,
							ean,
							herstnr
						)
			VALUES 
						('".$Lieferscheinnr."',
						 '".$Name1."',
						 '".$Name2."',
						 '".$Street."',
						 '".$Kundennr."',
						 '".$LKZ."',
						 '".$plz."',
						 '".$Ort."',
						 '".$Liefer_po."',
						 '".$Gewicht."',
						 '".$EMail."',
						 '".$Bez1."',
						 '".$Bez2."',
						 '".$BestellMenge."',
						 '".$Tel."',
						 '".$Fax."',
						 '".$Bestellnummer."',
						 '".$Lagerort."',
						 '".$ident."',
						 '".$ean."',
						 '".$herstnr."')";
						 
   
   echo $insert."<br \>";
   $result = mysql_query($insert);

   }
  rename ("glx.csv", "glx.erl");
  echo "<a href='index.php'>Index</a>";
?>
 
Hallo alxy,

das ist für mich sehr kompliziert, ehrlich gesagt! Weil wenn ich das verstehen könnte was diese Library macht und wie ich es für meine Sache einsetze, würde ich das Problem schnell lösen! Trotzdem Danke!

MfG
Dave
 
Zusammenkopiert:

PHP:
<?php 
$verzeichnis = "import/"; 
// Text, ob ein Verzeichnis angegeben wurde 
if ( is_dir ( $verzeichnis )) 
{ 
    // öffnen des Verzeichnisses 
    if ( $handle = opendir($verzeichnis) ) 
    { 
        // einlesen des Verzeichnis 
        while (($file = readdir($handle)) !== false) 
        { 
            if ($file == '.' || $file == '..') {
                continue;
            }
            $file = file($file); 

            foreach($file as $fh) 
            { 
              $info = explode(";", $fh); 
              $Lieferscheinnr = $info[0]; 
              $Name1 = $info[1]; 
              $Name2 = $info[2]; 
              $Street = $info[4]; 
              $Kundennr = $info[5]; 
              $LKZ = $info[6]; 
              $plz = $info[7]; 
              $Ort = $info[8]; 
              $Liefer_po = $info[9]; 
              $Gewicht = $info[10]; 
              $EMail = $info[11]; 
              $Bez1 = $info[12]; 
              $Bez2 = $info[13]; 
              $BestellMenge = $info[14]; 
              $Tel = $info[15]; 
              $Fax = $info[16]; 
              $Bestellnummer = $info[20]; 
              $Lagerort = $info[26]; 
              $ident = $info[29]; 
              $ident = str_replace(" ", "", $ident); 
              $ident = str_replace("\r", "", $ident); 
              $ident = str_replace("\n", "", $ident); 
              $sql = "SELECT  
                            ean, herstnr  
                       FROM  
                            stammdaten  
                       WHERE 
                        Ident = '".$ident."'"; 
              echo $sql; 
                $res = mysql_query($sql); 
                $dsatz = mysql_fetch_assoc($res); 

            $ean = $dsatz['ean']; // augelesener wert aus Stammdaten 
            $herstnr = $dsatz['herstnr']; // augelesener wert aus Stammdaten 

               $insert= "INSERT INTO gls 
                                    ( 
                                        Lieferscheinnr, 
                                        Name1, 
                                        Name2, 
                                        Street, 
                                        Kundennr, 
                                        LKZ, 
                                        PLZ, 
                                        Ort, 
                                        Liefer_po, 
                                        Gewicht, 
                                        Mail, 
                                        Bez1, 
                                        Bez2, 
                                        BestellMenge, 
                                        Tel, 
                                        Fax, 
                                        Bestellnummer, 
                                        Lagerort, 
                                        Ident, 
                                        ean, 
                                        herstnr 
                                    ) 
                        VALUES  
                                    ('".$Lieferscheinnr."', 
                                     '".$Name1."', 
                                     '".$Name2."', 
                                     '".$Street."', 
                                     '".$Kundennr."', 
                                     '".$LKZ."', 
                                     '".$plz."', 
                                     '".$Ort."', 
                                     '".$Liefer_po."', 
                                     '".$Gewicht."', 
                                     '".$EMail."', 
                                     '".$Bez1."', 
                                     '".$Bez2."', 
                                     '".$BestellMenge."', 
                                     '".$Tel."', 
                                     '".$Fax."', 
                                     '".$Bestellnummer."', 
                                     '".$Lagerort."', 
                                     '".$ident."', 
                                     '".$ean."', 
                                     '".$herstnr."')"; 
                                      
                
               echo $insert."<br \>"; 
               $result = mysql_query($insert); 

               } 
              rename ($file, str_replace('.csv', '', $file) . '.erl'); 
              echo "<a href='index.php'>Index</a>"; 
        } 
        closedir($handle);         
    } 
}

Falls du an ner schönen Lösung interessiert bist, sag Bescheid. Vielleicht bastel ich die dann auch nochmal.
 
Guten Morgen alxy,

besten dank für deine Bemühungen! Genauso ähnlich wie du habe ich es aucschon probiert jedoch ohne erfolg! Er hat gemeckert das die Variable $csvdateinamen nicht deklariert ist obwohl in dieser variable der Array der Dateien gespeichert ist! Dein Code wird auch ausgeführt jedoch bei Rename meckert er!

Warning: rename() expects parameter 1 to be string, array given in C:\xampp\htdocs\gls\import.php on line 136

PHP:
rename ($file, str_replace('.csv', '', $file) . '.erl');

Warning: file(path.php) [function.file]: failed to open stream: No such file or directory in C:\xampp\htdocs\gls\import.php on line 44

PHP:
$file = file($file); //Zeile 44

            foreach($file as $fh) //Zeile 46 
            {

Was wäre denn deiner Ansicht nach eine bessere Lösung?

MfG
Dave
 
Mit der von mir vorgestellten bibliothek und der besseren PDO-extension. (mysql ist ab php5.5 veraltet und wird in zukünftigen versionen komplett wegfallen!)

PHP:
<?php

use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');

$config = new LexerConfig();
$config->setDelimiter(';');
$lexer = new Lexer($config);

$interpreter = new Interpreter();

$interpreter->addObserver(function(array $columns) use ($pdo) {
    $stmt = $pdo->prepare('INSERT INTO gls (Lieferscheinnr, Name1, Name2, Street, ...statment) VALUES (?, ?, ?, ?, ...)');
    $stmt->execute($columns);
});

$directoryIterator = new DirectoryIterator('import/');
foreach ($directoryIterator as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename()); // testing purpose
        $lexer->parse($fileinfo->getFilename(), $interpreter);
        rename ($fileinfo->getFilename(), str_replace('.csv', '.erl', $fileinfo->getFilename()));
    }
}

es kann sein, dass du vor die jeweiligen $fileinfo->getFilename() noch den verzeichnisnamen (import) packen musst. Der SQL teil ist auch unvollständig.
 
Hallo Alxy,

leider ****t das bei mir nicht, da ich PHP version 5.2.4 nutze! Und alles umzustellen, nur wegen der einen Sache ist mir das zu umständlich. Dann greife ich auf deine 1ste Version zurück! Danke für deine Bemühungen! Dafür gebe ich ne runde Kaffee aus!

MfG
Dave
 
Zurück