Csv Export

webguru2009

Mitglied
Hallo,

ich habe mir einmal ein Script bauen lassen was eine Csv Datei in eine Datenbank importiert und die importierte Csv Datei dann ergänzt und wieder ausgibt.
Jetzt möchte ich gern das die Daten nicht an letzter Stelle ergänzt werden sonden in das Feld Email vond er CSV Datei aber nur dann wenn das Feld leer ist.

Ist dies Möglich?

Hier ist das Script:
Zitat:

PHP:
<?php

// Import und Export Dateien
define( 'FOLDER' , 'files/' ); // Name des Ordners in dem die Import-Dateien liegen
define( 'EXTENSION' , '.csv' ); // Dateiendung (inkl. Punkt) der Dateien die importiert werden sollen

// Datenbankzugangsdaten
define( 'DBHOST' , 'localhost' ); // URL des DB-Servers
define( 'DBUSER' , 'root' ); // Datenbankuser
define( 'DBPASS' , 'root' ); // Passwort des obigen Datenbankusers
define( 'DBDABA' , 'datenbank' ); // Datenbank in der die Tabellen liegen
// Tabellennamen
define( 'USERTABLE' , 'users' ); // Name der user-Tabelle

// CSV Einstellungen
define( 'DELIMITER' , ',' ); // Trennzeichen in den CSV-Dateien
define( 'ENCLOSURE' , '"' ); // Maskierungszeichen in den CSV-Dateien

// Teil der bei den generierten Benutzernamen hinter dem @ steht
define( 'USERNAMEHOST' , 'localhost.de' );

/* 
* Tabellenspaltendefinition:
* 
* Stellt die Zuordnung der Tabellenspalten zu den CSV-Spalten her
* 
* Der Key eines Eintrags stellt den Namen des Tabellenfelds dar.
* 
* Es müssen wenigstens alle Felder definiert sein, die in der Tabelle
* als NOT NULL und ohne DEFAULT gekennzeichnet sind.
* 
* Wird einem Feld ein einfacher String zugeordnet, so wird dieser Wert
* bei jeder Zeile als Standardwert gesetzt.
* 
* Ist dem Feld hier ein Array zugeordnet, so muss es in diesem Array zumindest
* einen String mit dem key 'col' geben. Dieser String bezeichnet die Spalte
* der import.csv die in dieses Feld geschrieben werden soll.
* 
* Wird statt des Strings ein Array gegeben, so können in diesem Array
* mehrere Spalten der CSV aneinandergereiht in dieses Feld eingetragen werden.
* Wird zusätzlich zu diesem Array noch ein 'format' String angegeben,
* so werden die Spalten nach diesem Format zusammengefügt.
* 
* Der 'format'-String entspricht der PHP-Funktion vsprintf, als Array
* werden die Spaltenwerte übergeben.
* 
*/ 
$MAPPING = array(

'email' => array('col'=>array('Vorname','Name ','Geburtsdatum'),'format'=>'%s.%s.%s@'.USERNAMEHOST)
, 'vorname' => array('col'=>'Vorname')
, 'nachname' => array('col'=>'Name ')
, 'strasse' => array('col'=>'Straße')
, 'hnr' => array('col'=>'Hausnr')
, 'plz' => array('col'=>'PLZ','format' => '%05s') // PLZ ggf. mit Nullen auffüllen
, 'ort' => array('col'=>'Ort')
, 'land' => 1
, 'tel' => array('col'=>'Rückrufnummer')
, 'fax' => ''
, 'altmail' => array('col'=>'email')
, 'passwort' => 'dc587860af20388e56b87ffee09d8155'
, 'mail2sms_nummer' => ''
, 'forward_to' => ''
, 'ip' => ''
, 'pw_reset_new' => ''
, 'pw_reset_key' => ''
, 'absendername' => ''
, 'profilfelder' => ''
, 'notes' => ''
, 'contactHistory' => ''
, 'uid' => ''

);

// *** ACHTUNG: Ab hier enden die Einstellungen und das Script beginnt *** //


// Eigene fputcsv, da alle Werte von enclosure umschlossen werden sollen
function fputenccsv( $handle , $fields, $delimeter = "," , $enclosure ="\"" ) {
fwrite($handle, utf8_decode( (count($fields)) ? $enclosure . implode("{$enclosure}{$delimeter}{$enclosure}", str_replace($enclosure, $enclosure.$enclosure, $fields)) . $enclosure . "\n" : "\n" ) ) ;
} 

// Überprüfen, ob der Benutzer den Vorgang angestoßen hat
if( $processed = ( isset( $_POST['submit'] ) && $_POST['submit'] !== '' ) )
{

mysql_connect( DBHOST , DBUSER , DBPASS ) or die( mysql_error() );
mysql_select_db( DBDABA ) or die( mysql_error() );

// Einlesen aller Postleitzahlen
$zustiege = array();
$zFile = fopen( 'zustiegsorte.csv' , 'r' );
if( false !== $zFile )
{
$zHeadings = array_flip( fgetcsv( $zFile , null , ',' , '"' ) );
while( false !== ( $zustieg = fgetcsv( $zFile , null , ',' , '"' ) ) )
$zustiege[$zustieg[$zHeadings['PLZ1 ohne Formel']]] = $zustieg;
}

$newUsers = 0;
$successful = array();
$errors = array();

// Alle Dateien aus dem Ordner verarbeiten
$folder = opendir( FOLDER ); 

if( false !== $folder )
{

while( false !== ( $iFile = readdir( $folder ) ) )
{


// Dateien überspringen, die nicht der Import-Endung entsprechen
if( strrchr( $iFile , "." ) !== EXTENSION ) continue; 

// Versuchen Datei zu öffnen
if( false !== ( $import = fopen( FOLDER . $iFile , 'r' ) ) )
{

$fileErrors = array();

// In dieser Variable wird die neue Importdatei gespeichert
$iRows = array();
// In dieser Variable werden alle Datensätze für die DB gespeichert
$newRows = array();

// Einlesen der Spaltenüberschriften aus der Importdatei
$iHeadings = fgetcsv( $import , null , DELIMITER , ENCLOSURE );
// Hinzufügen der neuen Spalten
$iHeadings[] = 'email';
foreach( $zHeadings as $col => $position )
$iHeadings[] = $col;
$iRows[] = $iHeadings;
// Umdrehen der Schlüssel und Werte um später die Zuordnung herzustellen
$iHeadings = array_flip( $iHeadings );

while( false !== ( $iRow = fgetcsv( $import , null , DELIMITER , ENCLOSURE ) ) )
{

// Leere Zeilen überspringen
if( count( $iRow ) < 1 || ( count( $iRow ) == 1 && trim( $iRow[0] ) == '' ) ) continue;

$newRow = $MAPPING;
foreach( $newRow as $col => $value )
{

// Überprüfen ob mehr als einen Standardwert definiert wurde
if( is_array( $value ) )
{
// Es muss mindestens der Spaltenname in der CSV angegeben sein
if( !array_key_exists( 'col' , $value ) )
{
$errors['mapping'] = 'Fehler in der Tabellenspaltendefinition, Spalte: ' . $key;
break;
}

// Überprüfen ob der Wert zusammengesetzt ist, wenn nicht dann simulieren
if( !is_array( $value['col'] ) )
$value['col'] = array( $value['col'] );

// Alle Spalten aus der CSV holen
foreach( $value['col'] as $key => $csvcol )
$value['col'][$key] = $iRow[$iHeadings[$csvcol]];

// Formartiert zusammenführen oder einfach aneinanderhängen
if( array_key_exists( 'format' , $value ) )
$value = vsprintf( $value['format'] , $value['col'] );
else $value = implode( '' , $value['col'] ); 

}

$newRow[$col] = $value;

}

$newRows[] = $newRow;

// Ergänzen der Importzeile
$iRow[] = $newRow['email'];
if( array_key_exists( $newRow['plz'] , $zustiege ) )
{
$zustieg = $zustiege[$newRow['plz']];
foreach( $zustieg as $cell )
$iRow[] = $cell; 
} else
{
foreach( $zHeadings as $cell )
$iRow[] = ''; 
}

$iRows[] = $iRow;

if( count( $fileErrors ) > 0 ) break;

}

if( count( $fileErrors ) == 0 )
{

fclose( $import );
// Neuschreiben der Importdatei
$import = @fopen( FOLDER . $iFile , 'w' );
if( false !== $import )
{


$query = "INSERT INTO " . USERTABLE . " (" . implode( ',' , array_keys( $MAPPING ) ) . ") VALUES ";

for( $i = 0 ; $i < count( $newRows ) ; $i++ )
{
$query .= ( $i == 0 ? "" : " , " ) . "(";
$j = 0;
foreach( $newRows[$i] as $value ) 
$query .= ( $j++ == 0 ? "" : "," ) . "'$value'";
$query .= ")";
} 

if( mysql_query( $query ) ){

foreach( $iRows as $iRow )
fputenccsv( $import , $iRow , DELIMITER , ENCLOSURE );
$successful[] = $iFile;

$newUsers += count( $newRows );

} else $errors['db'] = 'Es ist ein Fehler beim schreiben in die Datenbank aufgetreten: ' . mysql_error();

fclose( $import );

} else $errors[''] = 'Datei "' . FOLDER . $iFile . '" konnte nicht geschrieben werden.';

}

} else $errors[] = 'Die Datei "' . FOLDER . $iFile . '" konnte nicht gelesen werden.';

}

} else $errors[] = 'Das Verzeichnis "' . FOLDER . '" existiert nicht oder konnte nicht geöffnet werden.'; 

}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>CSV Im- und Export</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>CSV Im- und Export</h1>

<?php if( $processed ) : ?>

<?php if( count( $errors ) > 0 ) : ?>
<p>Während der Verarbeitung sind folgende Fehler aufgetreten:</p>
<ul>
<?php foreach( $errors as $error ): ?>
<li><?php echo $error ?></li>
<?php endforeach; ?>
</ul>
<p>
Die fehlerhaften Dateien wurden nicht verarbeitet.
Sie können nach einer Korrektur erneut importiert werden.
</p>
<?php endif; ?>
<p><strong>Der Im-/Export wurde durchgeführt.</strong></p>
<p>Es wurden insgesamt <?php echo $newUsers ?> neue Benutzer in der Datenbank angelegt.</p>
<p>Folgende Dateien wurden erfolgreich verarbeitet:</p>
<ul>
<?php foreach( $successful as $succ ): ?>
<li><a href="<?php echo FOLDER . $succ ?>"><?php echo FOLDER . $succ ?></a></li>
<?php endforeach; ?>
</ul>
<p>Sie wurden um Benutzername und Zustiegsortinformationen ergänzt.</p>


<?php else : ?>

<p>
Bevor Sie den Prozess starten, vergewissern Sie sich bitte,
dass alle Dateien mit der Endung <?php echo EXTENSION ?> im Ordner
<?php echo FOLDER ?> für PHP les- bzw. beschreibbar sind:
</p>

<form action="" method="post">
<input type="submit" name="submit" value="Im-/Export starten!" 
onclick="java script: this.style.visibility='hidden'; this.parentNode.insertBefore( document.createTextNode('Prozess wird ausgef&uuml;hrt...') , this );"
/>
</form>

<?php endif; ?>

</body>
</html>
 
Zurück