CSV Datei Import in eine MYSQL Datenbank über PHP

Sprich du hast in der ersten Zeile der CSV die "Überschriften" für die Zeilen die durch die vertikale Darstellung der Zeilen aus der CSV Datei resultieren?

Wenn ja, dann tu doch mal Butter bei die Fische und sag, wieviele Zeilen die CSV hat, oder ob das Variabel ist.
 
moment, ich mach mal einen screen, dann wird das deutlich.
oh nein, merke gerade, dass das nichtmehr funktioniert.

also dann nochmal infos zum gesamten prinzip.

ich habe eine alte datenbank und muss deren daten in eine neue datenbank migrieren.

dazu habe ich nun eine datei erstellt, die 2 spalten hat im layout. in der linken spalte wird 2spaltig der inhalt der alten datenbank durch das importieren einer csv datei angezeigt. dabei muss von dieser spalte die linke seite (also array1) nur einmal ausgelesen werden, damit dort die überschriften stehen. spalte 2 (also array2) sollte variabel sein und zwar dahingehend, dass man damit jede zeile der CSV datei auslesen kann. durch 2 submit buttons ("next" und "previous" ) soll man durch die datensätze navigieren können.
in der rechten spalte des layoutes ist dann die struktur der neuen datenbank, die dynamisch aus den inhalten der linken spalte generiert wird. durch if abfrage blöcke wird der datensatz der linken spalte in die rechte neu einsortiert.

ich versuche das nochmal als ascii bild:

|_______spalte1________||______spalte 2______|
| ____alte datenbank_____|| __neue datenbank__ |

| csvarray1[1] |csvarray2[1] || titelneu |neudatensatz |
| csvarray1[2] |csvarray2[2] || titelneu |neudatensatz |
| csvarray1[3] |csvarray2[3] || titelneu |neudatensatz |
| csvarray1[4] |csvarray2[4] || titelneu |neudatensatz |
| csvarray1[5] |csvarray2[5] || titelneu |neudatensatz |

<< previous___________________________next >>


die anzahl der zeilen der csv ist variabel, die pcs werden ja ständig neu hinzugefügt. nur die erste zeile ist immer gleich, die überschrift eben. aber auch die muss jedesmal, wenn die csv geladen wird, neu ausgelesen werden, sollte sich etwas an den spaltentiteln ( csvarray1[1] ) ändern
 
Zuletzt bearbeitet:
Alles schön und gut, aber:

1) Bitte halte dich in Zukunft unbedingt an unsere Netiquette bezüglich Groß/Kleinschreibung.

2) Ich werde beim besten Willen nicht Schlau aus deinen Ausführungen. Entweder, ich verstehe dich nicht, oder was du vorhast ist in höchstem Maße schwachsinnig und viel einfacher zu lösen.

Frage in den Raum: Versteht irgendwer, was er meint?

Datenbank portieren? Von was für einer DB in was für eine andere denn?
 
Wir haben eine Datenbank mit PCs, die erfasst, welche Art von Prozessor, welche Festplatte, welche Grafikkarte, welche IP, die Rechner haben und wer den Rechner gerade nutzt. Diese Datenbank wurde von einem Mitarbeiter vor 8 Jahren erstellt und ist weder normalisiert, noch in irgendeiner anderen Art und Weise den herkömmlichen Standards von Datenbanken angepasst.
Im Grunde ist es nur eine Excel Tabelle, die sich Datenbank schmipft.

Ich muss nun im Rahmen eines Praktikums in dieser Firma mit einer Programmiersprache (PHP), die ich nur aus der Schule aus einem Halbjahr kenne, diese alte Datenbank in eine normalisierte Form umbauen. Die neue Datenbankstruktur habe ich bereits fertig.

Nun geht es darum die Datensätze der alten Datenbank in die neue Datenbank zu migrieren.

Dazu wollte ich aus der alten Datenbank eine CSV Datei basteln, diese via PHP importieren und dann in die neue Datenbank (MYSQL) einsortieren. Als Kontrollzwischenschritt möchte ich jeweils einen Datensatz (also eine Zeile der CSV Datei) auf dem Bildschirm ausgeben (Linke Spalte). Dabei wird nach den Regeln, die ich zum Einsortieren in die neue Datenbank angelegt habe, der Inhalt der CSV Datei in die neue Datenbank einsortiert und erstmal ausgegeben (Rechte Spalte). Somit habe ich auf einer HTMLSeite 2 Spalten - auf der einen Seite die alte Datenbank und auf der anderen Seite die gleichen Daten, wie sie in der neuen Datenbank einsortiert sind. Ich kann also kontrollieren, ob meine Regeln, die ich für das Sortieren der Datensätze in die neue Datenbank angelegt habe, richtig sind.

Mit 2 Submitbuttons möchte ich dann die Zeile der CSV Datei weiterschalten können. Jeweils "Vor" oder "Zurück" und somit kontrollieren, ob das Sortieren für die anderen Datensätze auch stimmt.

Ich habe derzeit 3 Dateien.
dbmaske1.php -> Hier wird über ein "Durchsuchen" Feld die CSV Datei angegeben und an die nächste Datei weitergegeben
dbmaske2.php -> Hier findet die Gegenüberstellung eines Datensatzes der CSV Datei statt mit der Funktion jeweils einen Datensatz weiter und einen Datensatz zurück zu navigieren
dbmaske3.php -> Hier wird dann via PHP und den definierten Sortierregeln der Inhalt der alten CSV Datei unter Verwendung von MYSQL in die neue Datenbank geschrieben.

Danke für die Geduld, die Ihr mit mir habt und für die enorme Hilfe, die Ihr mir gerade seid!


Hier nochmal zum Copy und Pasten das Layout der 2ten Datei. Das hilft beim Verständnis des Problems glaube ich nochmal enorm. Ist mit Dreamweaver gemacht, der Code wird noch entmistet, aber damit ging es nun bedeutend schneller.
PHP:
<HTML><HEAD><TITLE>Datenbanktransfermaske</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<STYLE type=text/css>
A:hover {
	FONT-SIZE: 10px; COLOR: #ff0000; FONT-FAMILY: verdana; TEXT-DECORATION: none
}
A:link {
	FONT-SIZE: 10px; COLOR: #ff0000; FONT-FAMILY: verdana; TEXT-DECORATION: none
}
A:visited {
	FONT-SIZE: 10px; COLOR: #ff0000; FONT-FAMILY: verdana; TEXT-DECORATION: none
}
A:active {
	FONT-SIZE: 10px; COLOR: #ff0000; FONT-FAMILY: verdana; TEXT-DECORATION: none
}
.font {
	FONT-SIZE: 10px; COLOR: #000000; FONT-FAMILY: verdana
}
.Stil1 {
	FONT-WEIGHT: bold; COLOR: #ff0000
}
.Stil3 {
	COLOR: #000000
}
.Stil4 {
	COLOR: #ff0000
}
.submit {
	FONT-SIZE: 10px; COLOR: #ff0000; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
</STYLE>

</HEAD>
<BODY class=font>
<P class=Stil1 align=center>Schritt 2 / 3 <BR><SPAN class=Stil3>Überprüfung der 
Datenmigration<BR><BR><STRONG><SPAN class=Stil4><A 
href="http://localhost/dbmaske.php">&lt;&lt; Schritt 1</A></SPAN>&nbsp;<B>|</B> 
<SPAN class=Stil4><A href="http://localhost/dbmaske3.php">Schritt 3 
&gt;&gt;</A></SPAN> </STRONG></SPAN></P>
<TABLE 
style="BORDER-RIGHT: #000000 thin solid; BORDER-TOP: #000000 thin solid; BORDER-LEFT: #000000 thin solid; BORDER-BOTTOM: #000000 thin solid" 
cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR bgColor=#eeeeee>
    <TD vAlign=center bgColor=#eeeeee>
      <DIV align=center><STRONG>- Alte "Datenbank" - <BR></STRONG></DIV></TD>
    <TD bgColor=#eeeeee>
      <DIV align=center><STRONG><BR>- Neue Datenbank - 
  <BR><BR></STRONG></DIV></TD></TR>
  <TR bgColor=#eeeeee>
    <TD vAlign=top colSpan=2>
      <DIV align=center><STRONG>
      <FORM action=$php_self method=get><INPUT class=submit type=submit value="<<" name=back> 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <INPUT class=submit type=submit value="Diesen Datensatz migrieren" name=migrieren> 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <INPUT class=submit type=submit value=">>" name=next></FORM></STRONG></DIV>
      <DIV align=center></DIV></TD></TR>
  <TR>
    <TD vAlign=top width="50%"><!-- erste spalte - alte datenbank inhalte -->
      <TABLE cellPadding=1 width="100%" border=0 class="font">
        <TBODY>
        <TR>
          <TD bgColor=#eeeeee>TERM_ADR</TD>
          <TD bgColor=#cccccc><input class=submit readonly value=zeile1a 
            name=alt0></TD>
        </TR>
        <TR>
          <TD bgColor=#eeeeee>TERM_ADR_A</TD>
          <TD bgColor=#cccccc><INPUT class=submit readOnly value=b 
          name=alt1></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>DRU_ADR</TD>
          <TD bgColor=#cccccc><INPUT class=submit readOnly value=c 
          name=alt2></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>NAME</TD>
          <TD bgColor=#cccccc><INPUT class=submit readOnly value=d 
          name=alt3></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>ABT_ALT</TD>
          <TD bgColor=#cccccc><INPUT class=submit readOnly value=e 
          name=alt4></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>undsoweiter</TD>
          <TD bgColor=#cccccc>undsoweiter</TD>
        </TR>
        </TBODY></TABLE></TD>
    <TD vAlign=top width="50%">
      <TABLE cellPadding=1 width="100%" border=0 class="font">
        <TBODY>
        <TR bgColor=#e0e0e0>
          <TD colSpan=2><STRONG>PC_Systeme</STRONG></TD></TR>
        <TR>
          <TD width="50%" bgColor=#eeeeee>pcnr</TD>
          <TD width="50%" bgColor=#cccccc><INPUT class=submit value=$[] 
          name=Input22232111></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>terminalnr</TD>
          <TD bgColor=#cccccc><INPUT class=submit value=$[] 
          name=Input22232112></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>gebaeudenr</TD>
          <TD bgColor=#cccccc><INPUT class=submit value=$[] 
          name=Input22232113></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>zimmer</TD>
          <TD bgColor=#cccccc><INPUT class=submit value=$[] 
          name=Input22232114></TD></TR>
        <TR>
          <TD bgColor=#eeeeee>undsoweiter</TD>
          <TD bgColor=#cccccc>undsoweiter</TD>
        </TR>
        </TBODY></TABLE></TD></TR>
  <TR>
    <TD bgColor=#eeeeee colSpan=2>
      <DIV align=center><BR></DIV></TD></TR></TBODY></TABLE>
<DIV align=center><STRONG><BR><SPAN class=Stil4><A 
href="http://localhost/dbmaske.php">&lt;&lt; Schritt 1</A></SPAN>&nbsp;<B>|</B> 
<SPAN class=Stil4><A href="http://localhost/dbmaske3.php">Schritt 3 
&gt;&gt;</A></SPAN> </STRONG></DIV></BODY></HTML>
 
Zuletzt bearbeitet:
PHP:
$csvFile = "datei.csv";
$fileArray = file($csvFile);

/* Du solltest über eine GET Variable festlegen, welche Zeile aus der
CSV Datei gelesen werden soll.
Wenn ich dich richtig verstanden habe, sollen ganz links immer  die
"Überschriften" stehen. Es ist also nur $array2 "variabel.

Im folgenden Beispiel wird davon ausgegangen, dass du die jeweilige
Zeile über $_GET['row'] übergeben hast.
*/

$array1 = explode(";",$fileArray[0]);
$array2 = explode(";",$fileArray[$_GET['row']-1]);

if(count($array1) >= count($array2)) { $maxrows = count($array1); }
else { $maxrows = count($array2); }

echo "<table>\n";

for($i=0;$i<$maxrows;$i++) {
  if($array1[$i] == "" || !isset($array1[$i])) {
    $array1[$i] = "&nbsp;";
  }
  if($array2[$i] == "" || !isset($array2[$i])) {
    $array2[$i] = "&nbsp;";
  }

  echo "\t<tr><td>".$array1[$i]."</td><td>".$array2[$i]."</td></tr>\n";
}
echo "</table>";
Jetzt muss du nur noch am unteren Ende der Seite die zwei Buttons entsprechend definieren. Am besten wie folgt, nur dann noch um einige "Kollisionsabfragen" erweitert.
PHP:
echo "<button name=\"back\" value=\"zurück\" onclick=\"location.href=".$_SERVER['PHP_SELF']."?row=".$_GET['row']-1."\" />";
echo "<button name=\"forward\" value=\"vorwärts\" onclick=\"location.href=".$_SERVER['PHP_SELF']."?row=".$_GET['row']+1."\" />";
Hilft das, oder bin ich immer noch nicht dem wirklichen Problem auf der Spur?
 
Sofern ich das auf den ersten Blick sehe, scheint es genau das zu sein, was ich benötige. Ich teste das jetzt erstmal aus.

Danke schonmal, ich melde mich dann nochmal.

Edit 1: Die Get Row werde ich über den Link von Datei 1 zu Datei standardmässig erstmal mit Zeile 1 (also erster auszulesender Zeile NACH der Titelzeile meine ich damit - de Fakto also Zeile 2)übergeben.
Ist der Syntax :
PHP:
dbmaske.php?row=2
korrekt?

Edit2: Ja ist es, es funktioniert schonmal, wenn ich es in der dbmaske2.php hinten an den Link schreibe.

Dummerweise vergisst er die Belegung der Variable 'row', wenn ich versuche die Variable mit der Datei dbmaske.php über den Link weiterzugeben.

Hier nun mal das Formularfeld, dass die Daten an die dbmaske2.php übergibt. Die Variable Frank ist die Location der CSV Datei auf der Festplatte. Alles, was dahintersteht, vergisst er.

PHP:
<form method="get" action="dbmaske2.php?frank&row=2">
  <table  border="0" cellpadding="0" style="border:1; border-color:#000000; border-style:solid; border-width:thin;" align="center">
    <tr>
      <td bgcolor="#eeeeee" style="border-right:1 black solid;"><div align="center">
          <input CLASS="submit" type="file" value="c:\*.CSV" name="frank">
          <br>
      </div></td>
    </tr>
    <tr>
      <td bgcolor="#eeeeee" style="border-right:1 black solid;"><div align="center">
        <input CLASS="submit" name="submit" type="submit" value="Datei laden">
      </div></td>
    </tr>
  </table></form>

Nach dem Klick auf Durchsuchen und dem Auswählen der Datei wird über einen Klick auf Datei Laden die nächste URL (dbmaske2.php) aufgerufen.

Was muss ich nun tun um den Browser das "Vergessen der letzten Variable über den Link mitzugeben" abzugewöhnen ?
 
Zuletzt bearbeitet:
Ich kapiere nicht genau was du meinst. Klar ist jedoch das $_GET['row'] nur auf den Seiten gesetzt ist, die mit seite.php?row=wert aufgerufen werden.
 
Ja, er übergibt die Variable Row jedoch nicht mit dem Link, obwohl ich sie angegeben habe im Form Action teil. Er scheint sie schlichtweg zu "vergessen".
Die Adresszeile bei der dbmaske2.php (also der unmittelbar folgenden Datei) lautet:

PHP:
http://localhost/dbmaske2.php?frank=D%3A%5Cphpmysqlwebserver%5Cminixampp%5Chtdocs%5Ctestds.csv&submit=Datei+laden

Wobei seltsamerweise da das "Submit = Datei Laden" steht. Der Knopf sollte eigentlich keine Variable weitergeben, sondern einfach das Formularfeld ausführen. Also das Weiterleiten zur nächsten Seite auslösen. Das Row hingegen verschwindet vollkommen.
Oben im Edit steht nochmal das Formularfeld, dass ich zum Übergeben der Daten nutze.

Habe zwischenzeitlich versucht die Vorwärts und Zurück Buttons einzubinden.
in der Zeile, in der ich Deinen Befehl eingefügt habe bekomme ich folgenden Fehler ausgegeben:

Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in D:\phpmysqlwebserver\minixampp\htdocs\dbmaske2.php on line 65

Ich habe mal drüber geschaut, aber in den Anführungszeichen und Semicolons (was ist nochmal Plural von Semicolon? Semicoli ?) keine Fehler gefunden.
 
Zuletzt bearbeitet:
Also das mit dem Row Problem habe ich nun dadurch gelöst, dass ich den Button , der davor Datei Laden in 2 umbenannt habe und den Button, der Submit hieß in row.

Sieht zwar etwas doof aus, aber funktioniert. Das ist die Hauptsache.

Nur das mit der zeilenweisen Navigation funktioniert noch nicht.
Da gibt er mir auch nach allem Rumprobieren nur diese Parse Errors (Siehe Oben) aus.
 

Neue Beiträge

Zurück