|

Themen:

CSV upload und MySQL-Import

Rohdaten die in drei CSV-Dateien geliefert werden, sollen in eine MySQL-Datenbank importiert werden.

Achso … die CSV-Dateien sind mit Semikolon getrennt, haben aber ansonsten den identischen Aufbau. Spalte 1 eine ID, Spalte 2 eine der ID zugeordnete Zahl (Anzahl der Zugriffe). Die Daten kommen jeden Montag für die letzte Woche. Daher erfolgt eine Zuordnung pro Kalenderwoche. Das Ergebnis in der Datenbank soll dann so aussehen:

 01-1502-1503-15
0013221421
00233332222
003221165

Datei-Upload

<form method="post" action="import.php" enctype="multipart/form-data">

Ein Formular mit dem alle denkbaren Dateien (Mulitpart) hochgeladen werden können. Außerdem können mehrer Dateien gleichzeitig ausgewählt werden.

 <input type="text" name="Kalenderwoche" value="">

Hier wird festgelegt in welcher Kalenderwoche die Daten erhoben wurden.

 <input name="datei[]" id="datei" type="file" multiple="" />
 <input type="submit"  value="Hochladen">
</form>

Nach dem Absenden des Formulars geht es in der Datei import.php weiter.

$kw = $_POST[kw];

Die vom Formular übertragene Kalenderwoche wird dem Array $kw übergeben.

$s = 0;

Ich definiere einen Wert für $s.

foreach ($_FILES['datei']['tmp_name'] as $file)

Eine Schleife. Die Schleife ließt aus $_FILES die erste Datei aus. Bei jedem durchlauf wird der Punkt auf die nächste Datei gesetzt, so lange bis alle Dateien verarbeitet sind.

 {
$name = 'import/import';
$name .= $s;
$name .= '.csv';

Definiert den Pfad und den Namen unter der die Datei auf dem Webspace abgelegt werden soll. Durch $s werden die Dateien fortlaufend nummeriert.

 move_uploaded_file($file, $name);
$s++;

Denn nach dem die Datei mit move_uploaded_file aus dem Array in das gewünschte Verzeichnis verschoben und umbenannt wurde, wird $s um 1 erhöht.

Hinweis: Man könnte das Formular zum Upload auf CSV-Dateien beschränken um den Upload von falschen Dateien zu verhindern und man könnte auch den originalen Dateinamen verwenden. Für meine Zwecke aber nicht erforderlich.

Import in die MySQL-Datenbank

Jetzt soll das ganze aber ja in die MySQL-Datenbank und dort in die Tabelle und der jeweiligen Kalenderwoche zugeordnet werden.

$res = mysql_query ("select * from `es-aus`");$num = mysql_num_fields($res);

Es wird die Tabelle „es-aus“ aus der Datenbank ausgelesen. Dann wird gezählt wie viele Spalten in dieser Tabelle enthalten sind.

for ($i=1; $i<=$num -1; $i++)

Jetzt startet eine Schleife die so oft durchläuft, wie es Spalten in der Tabelle gibt.

 {
$feld = mysql_field_name($res, $i);

Bei jedem Durchlauf wird der Spaltenname dem Array $feld zugewiesen und

 if ($feld == $_POST[kw])
{
$check = x;
} }

dann geprüft ob dieser mit dem übermittelten Kalenderwoche übereinstimmt. Wenn ja wird dem
Array $check der Wert x zugewiesen. Warum das ganze? Jede Spalte der Tabelle in der Datenbank steht für eine Kalenderwoche. Im ersten Durchlauf muss also die neue Spalte angelegt werden, im zweiten nicht mehr.

if ($check == x)
{
}
else
{
mysql_query ("ALTER TABLE  `es-aus` ADD  `$kw` int( 10 ) NOT NULL");
}

Daher wird jetzt geprüft ob $check mit x belegt ist und wenn nicht wird eine neue Spalte mit dem Titel der Kalenderwoche in die Datenbank eingefügt. Okay, die neue Datenbank ist vorbereitet. Jetzt muss der Inhalt der Datei in die Datenbank.

$datei = file("$name");

Hier wird die Datei $name in das Array $datei geladen.

for($i=0; $i < count($datei); $i++)

Ich zähle die Zeilen im Array $Datei und lasse die Schleife so oft durchlaufen wie das Array Zeilen hat. Hätte ich vermutlich eleganter auch mit foreach lösen können.

 {
$spalte = explode (";", $datei[$i])

Ich rufe jetzt mit jedem Schleifen durchlauf eine Spalte des Arrays auf und trenne diesen in einzelne Spalten auf. In dem Array (sowie auch in der importierten Datei) sind die Spalten mit einem Semikolon getrennt.

 $SDBID = $spalte[0];

Ich weiß, das in der ersten Spalte die ID steht und weise diese deshalb dem Array $SDBID zu. Diese wird für die folgende MySQL-Abfrage benötigt.

 $res = mysql_query ("SELECT * FROM `es-aus` WHERE `SDBID`LIKE '$spalte[0]'");
 $num = mysql_num_rows($res);
if ($num < 1)
{
mysql_Query ("INSERT INTO  `es-aus` ( `SDBID`) VALUES ('$spalte[0]');");
}

Die Abfrage prüft ob für die ID bereits eine Zeile besteht und wenn nicht, wird diese angelegt.

 $wert = mysql_Query ("SELECT * FROM `es-aus` WHERE `SDBID` LIKE '$SDBID'");
while ($wert1 = mysql_fetch_assoc($wert))
{

$haben = $wert1[$kw];
$dazu =  $spalte[1];
$summe = $haben + $dazu;
mysql_Query ("UPDATE `es-aus` SET `$_POST[kw]` = '$summe' WHERE `SDBID` =$spalte[0]");
}
}

Jetzt wird die Zeile ausgelesen, der Wert der aktuellen Woche $wert1[$kw] ausgewählt und mit dem Wert des aktuellen Durchlaus summiert. Anschließend wird der neu Wert geschrieben.

echo 'Die Datei ' . $name .  ' wurde importiert<br>';  

Dieser Vorgang wiederholt sich für jede Zeile und anschließen für jede hochbeladene Datei. Als kleinen Kontrollmechanismus gebe ich aus wann eine Datei fertig importiert wurde.

}