PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   Daten aus csv-Datei in zwei Tabellen speichern (http://www.selfphp.de/forum/showthread.php?t=17421)

sputnik72 13.08.2007 11:09:05

Daten aus csv-Datei in zwei Tabellen speichern
 
Hallo,
ich habe folgende Problemstellung, zu der ich einen guten Rat bräuchte:

Ich habe zwei Tabellen, wobei in Tabelle 1 Daten über Bücher abgelegt sind (Autor, Titel, usw., insgesamt 13 Felder inkl. ID) und die Tabelle 2 dazu dient, diese Bücher bestimmten Kategorien zuzuordnen. Tabelle 2 hat nur zwei Felder, eins mit dem Buch-ID und eins mit der Kategorienummer. Die zweite Tabelle gibt es, damit man ein Buch auch eventeuell mehreren Kategorien zuordnen kann.

Nun sollen Daten aus einer csv-Datei via php (nicht phpmyadmin) importiert werden. Die csv-Datei wird von einem Nutzer mit Hilfe von Excel oder OpenOffice generiert. Am besten wäre es, wenn der Nutzer nur EINE Tabelle bearbeiten bräuchte (bzw. soll er eine Vorlage benutzten), in der die Kategorienummer einfach als zusätzliches Feld eingetragen ist.

Das Hochladen und der Datenimport in Tabelle 1 ohne die Kategorie klappt soweit. Nach dem Hochladen mache ich den Import zur Zeit so, wobei ich vorher noch die ersten beiden Zeilen der Datei lösche, die die Überschriften und eine Beispielzeile enthält (ich vermute, dass man das auch eleganter machen kann, aber es funktioniert):

PHP-Code:

$str_ziel "/home/bokbyen.no/public_html/dokument/".$_FILES['thefile']['name'];

// Zugriffsrechte anpassen
chmod($str_ziel0777);

# erste Zeile (Ueberschriften) der csv-datei loeschen
$d file($str_ziel); 
unset(
$d[0]); 
$neu implode(""$d); 
$open fopen($str_ziel"w+"); 
fwrite($open$neu); 
fclose($open);  

# zweite Zeile der csv-datei loeschen
$d file($str_ziel); 
unset(
$d[0]); 
$neu implode(""$d); 
$open fopen($str_ziel"w+"); 
fwrite($open$neu); 
fclose($open);  

$sql "LOAD DATA LOCAL INFILE '$str_ziel' IGNORE INTO TABLE bokliste
FIELDS TERMINATED BY ';' "
;

if(
mysql_query($sql)) {
echo(
"<p><b>Data blei importert i databasen.</b></p>");
}

else {
echo(
"<p>Det oppstod ein feil under import av csv-data. Pr&oslash;v ein gong til.<br />".

       
"Feil: " mysql_error() . "</p>");


Doch mit dem zusätzlichen Kategoriefeld müsen die Daten ja erst irgendwie getrennt und dann in zwei verschiedene Tabellen importiert werden. Und hier weiss ich nicht genau, wie man am besten vorgehen sollte.

Ich habe irgendwo gelesen, dass man die Daten einer csv-Datei zeilenweise auslesen lassen und sie dann in einem Array speichern kann (wobei ich nicht weiss, wie man das macht), dann folgt der Import. Könnte man im Zuge einer solchen Vorgehensweise die Daten aus der csv-Datei auch trennen und zwei verschiedene Arrays erstellen, die dann jeweils in Tabelle 1 und 2 eingelesen werden? Falls ja, wie macht man das?
Oder gibt es noch eine einfachere Lösung für das Problem?

Wäre dankbar für Tips!

Beste Grüße
Sputnik

Raketenmann 13.08.2007 13:15:51

AW: Daten aus csv-Datei in zwei Tabellen speichern
 
Du kannst die csv-Datei mit der Funktion fgetcsv() Zeilenweise auslesen und die Spalten als Array erhalten.
Ansonsten Zeilen mit der Funktion fgets() auslesen und mit explode() die Spalten trennen.

Oder mit file() die ganze Datei einlesen und die Zeilen (Array!) mit explode() in eine zweite Array-Dimension oder ein Hilfsarray trennen.

Danach läuft eine Schleife durch das Array, die prüft ob das Buch der jeweiligen Zeile schon in der Tabelle 1 ist.
- Ja: UPDATE ... // oder auch kein Update, wie du willst
- Nein: INSERT ...

Weiter nimmt diese Schleife die Buch-ID (Bei einem Update "weißt" du die Buch-ID, bei einem Insert bekommst du sie über die Funktion mysql_insert_id(); ) und schreibt sie in die zweite Tabelle, zusammen mit der Kategorie Info aus deiner csv-Datei.

Die ersten beiden Zeilen kannst du bei dieser Art der Auswertung einfach überspringen, dafür muß nix in der Datei gelöscht werden.

sputnik72 13.08.2007 13:53:26

AW: Daten aus csv-Datei in zwei Tabellen speichern
 
Hallo,
vielen Dank für die Lösungsansätze, das hilft mir erstmal weiter!
Könnte ich Dich gegebenfalls später nochmal mit Nachfragen behelligen?

Gruß Sputnik

Raketenmann 13.08.2007 14:06:46

AW: Daten aus csv-Datei in zwei Tabellen speichern
 
Zitat:

Zitat von sputnik72 (Beitrag 105205)
Könnte ich Dich gegebenfalls später nochmal mit Nachfragen behelligen?

...probiers aus! ;-)

Sonst antwortet aber bestimmt auch jemand anders.

sputnik72 13.08.2007 14:55:40

AW: Daten aus csv-Datei in zwei Tabellen speichern
 
Hallo!

Zitat:

Die ersten beiden Zeilen kannst du bei dieser Art der Auswertung einfach überspringen, dafür muß nix in der Datei gelöscht werden.
Wie überspringe ich denn die ersten beiden Zeilen? Ich gehe davon aus, dass das in der while-Schleife passieren muss.

PHP-Code:

$fp fopen($str_ziel,"r");
while(
$zeile fgetcsv($fp,500,";")){

  for(
$x=0;$x<count($zeile);$x++){
# hier wird spaeter getrennt
  
}  
  echo 
"--<br>";
}
fclose($fp); 

Gruß Sputnik

Raketenmann 13.08.2007 15:47:00

AW: Daten aus csv-Datei in zwei Tabellen speichern
 
Wenn du nicht weißt, was in den Zeilen steht, kannst du einen Zähler mitlaufen lassen. Sonst geht es auch mit einer Bedingung, die sich auf den Inhalt in Element [0,0] bzw. [1,0] bezieht.

Die Zählervariante, denn ich weiß nicht was drinsteht ;-)

PHP-Code:

$first_rows=0;

$fp fopen($str_ziel,"r"); 
while(
$zeile fgetcsv($fp,500,";")){ 

if(
$first_rows<2
   {
      
$first_rows++;
   }
else
   {
       for(
$x=0;$x<count($zeile);$x++){ 
       
// hier wird spaeter getrennt 

       // Bem. Raketenmann: Es wurde bereits getrennt, durch fgetcsv..
      // ...hier die Elemente der jeweiligen Spalte in der Db zuordnen

       
}   
       echo 
"--<br>"
    }

fclose($fp); 


sputnik72 13.08.2007 17:12:15

AW: Daten aus csv-Datei in zwei Tabellen speichern
 
Hallo Raketenmann,

ich habe es hinbekommen.
Vielen Dank für die Anregungen und die Hilfe!

Beste Grüße
Sputnik


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:56:55 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.