CSV-Daten in Spalten, zeilenweise importieren

julia29

Erfahrenes Mitglied
Hi,
habe eine CSV-Datei wo die Daten spaltenweise aufgeführt sind.
Also alle Positionen einer User-ID mit der jeweiligen Anzahl /Stück in einer Zeile.

Daten-in-Spalten
ID Pos -> 101 102 103 104 105 106 201 202 203 204 205 206 301
62 Anz -> 11
63 Anz -> 1 11 21 31 41 51 61 71 61 91 101 111 311
64 Anz -> 1 11 12 13 14 15


Nun benötige ich jedoch den import in einer MySQL-Tabelle wo eine Position mit der Anzahl in einer Zeile aufgeführt ist.
Erst alle Daten einer User-ID, dann alle Pos. der nächsten ID. Etwa so:

Daten-in-Zeilen
ID Pos Anz.
62 101 11
63 101 1
63 102 11
63 103 21
63 104 31
63 105 41
63 106 51
63 201 61
63 202 71
63 203 81
63 204 91
63 205 101
63 206 111
63 301 311
64 101 1
64 102 11
64 103 12
64 104 13
64 105 14
64 106 15

Mein Ansatz die Daten in ein Array einzulesen habe ich so begonnen, bin mir jetzt aber im unklaren wie ich jetzt die Daten aufbröseln müsste.
PHP:
<?php
$datei=file("status.csv");
{
unset($inhalt,$daten1);
for ($i=0;$i<count($datei)+1;$i++){
$inhalt .="$datei[$i]";
}
// array aufbauen
$daten1=explode('~',$inhalt);
}
for ($i=0;$i<count($daten1);$i++){
// vorerst auf Bildschirm
echo "$daten1[$i]<br>";
} 
?>

Hat einer eine Lösung?
mfg
Julia
 
Würde wirklich gern weiterhelfen. Es wäre aber sinnvoll, einen tatsächlichen Auszug aus der CSV zu haben. Deine Beschreibung verwirrt mich momentan nur.
 
Habe ich doch, nur ohne Spaltenbegrenzer ( ; ),
die Daten in Spalten stehen derzeit so in der CSV-Datei

Daten-in-Spalten (csv-Datei)
ID; 101; 102; 103; 104; 105; 106; 201; 202; 203; 204; 205; 206; 301 <- die Positionen
62; 11
63; 1; 11; 21; 31; 41; 51; 61; 71; 61; 91; 101; 111; 311
64; 1; 11; 12; 13; 14; 15

Alles was in der Zeile hinter der ID in grün steht, sind Mengenangaben (Stück) zur jeweiligen Position.

Ich brauche die Daten jedoch in Zeilen (Beispiel siehe im 1. Thread)
 
Hi,

ich hab dir hier mal ein kleines Script geschrieben.
Sollte funktionieren so wie du es benötigst. Einfach mal ausführen und die Ausgabe ansehen, dann siehste es ja. Statt der Ausgabe kannst du die Daten ja dann in eine Datenbank einfügen.

PHP:
<?php
// (C) Manuel Freiholz
// Einlesen der Datei in einen Array.
$csvFile = "csvimport.csv";
$csvFileContent = file( $csvFile );

// Positionen.
$aPos = array();

// Bearbeiten jeder Zeile.
for( $i = 0; $i < count( $csvFileContent ); $i++ )
{
  // Positionen einlesen.
  if( $i == 0 )
  {
    $splitData = explode( ";", $csvFileContent[$i] );
    array_shift($splitData); // Entfernen des ersten Elements.
    $aPos = $splitData;
  }
  // Daten einlesen.
  else
  {
    $splitData = explode( ";", $csvFileContent[$i] );
    $id = array_shift( $splitData ); // Entfernen der ID aus dem array. Nun sind nur noch die "Anzahl" Werte vorhanden.
    
    // Iterieren der "Anzahl" Elemente.
    for( $n = 0; $n < count( $splitData ); $n++ )
    {
      // Hier werden alle Positionen mit deren Anzahl der aktuellen ID durchlaufen.
      // Folgende Daten sind an dieser Stelle verfügbar und können in die Datenbank eingefügt werden.
      // $id = Die aktuelle ID.
      // $aPos[$n] = Die aktuelle Spaltennummer.
      // $splitData[$n] = Der "Anzahl" Wert für die aktuelle Spaltennummer.
      print( $id . " - " . $aPos[$n] . " - " . $splitData[$n] . "<br/>\n" );
    }
  }
}
?>

Grüße
Manuel F.
 
Hi Gainwar,

auf den ersten Blick ist das super geworden. Muss mich später noch intensiver mit beschäftigen.
Auf jeden Fall bisher erstmal vielen Dank.

mfg
Julia
 
Hi Gainwar,

habe Dein Script für meine Anforderungen etwas angepasst, läuft soweit alles super.
Die Datenausgabe als 'print( $id . ";" . $aPos[$n] ......' habe ich zur Sichtkontrolle drin gelassen.
Bis da ist noch alles OK.
Nur beim Speichern in eine tmp-Datei wird immer nur der letzte Datensatz geschrieben.
In der MySQL kommt noch nichts an.

PHP:
<?php
// csv einlesen

// (C) Manuel Freiholz
// Einlesen der Datei in einen Array.
$csvFile = "status_2b.csv";
$csvFileContent = file( $csvFile );
$temppath= "status_2btemp.csv";

// Positionen.
$aPos = array();

// Bearbeiten jeder Zeile.
for( $i = 0; $i < count( $csvFileContent ); $i++ )
{
  // Positionen einlesen.
  if( $i == 0 )
  {
    $splitData = explode( ";", $csvFileContent[$i] );
    array_shift($splitData); // Entfernen des ersten Elements.
    $aPos = $splitData;
  }
  // Daten einlesen.
  else
  {
    $splitData = explode( ";", $csvFileContent[$i] );
    $id = array_shift( $splitData ); // Entfernen der ID aus dem array. Nun sind nur noch die "Anzahl" Werte vorhanden.
    
    // Iterieren der "Anzahl" Elemente.
    for( $n = 0; $n < count( $splitData ); $n++ )
    {
      // Hier werden alle Positionen mit deren Anzahl der aktuellen ID durchlaufen.
      // Folgende Daten sind an dieser Stelle verfügbar und können in die Datenbank eingefügt werden.
      // $id = Die aktuelle ID.
      // $aPos[$n] = Die aktuelle Spaltennummer.
      // $splitData[$n] = Der "Anzahl" Wert für die aktuelle Spaltennummer.
	  # print( $id . " - " . $aPos[$n] . " - " . $splitData[$n] . "<br/>\n" );
	  print( $id . ";" . $aPos[$n] . ";" . $splitData[$n] . "; <br/>\n" );
      $datei1 = ( $id . ";" . $aPos[$n] . ";" . $splitData[$n] . "; <br/>\n");
      
      //in Tempdatei speichern
		$fopen = fopen($temppath, "w+");
		$schreiben = fwrite($fopen, $datei1);
		fclose($fopen);
    }
  }
}

//Tempdatei öffnen
$fp = @fopen($temppath, "r") or die ("Kann Datei nicht lesen.");

//Zeilen auslesen und in der Datenbank speichern
while ($line = fgets($fp)) {
$my_array = explode(' ',$line,1024);

// Verbindung zur MySQL aufbauen
include ("02check.php");

// Daten in die MySQL schreiben
$sql = "INSERT INTO a_order f03='$my_array[3]',
                            f02='$my_array[2]',
                            f01='$my_array[1]',
							f0='$my_array[0]';";


if( mysql_query($sql)){
#$pruef = TRUE;
}

}

fclose($fp);
?>

Wo muss ich was ändern, damit alle DS eingetragen werden?

mfg
Julia
 
Zuletzt bearbeitet:
Guten Morgen Julia,

öffne die Datei doch mal mit dem Flag "a+", um weiteren Inhalt am Ende der Datei anzuhängen. Die Angabe "w+" leert die Datei bevor du hineinschreibst und somit ist immer nur der letzte Eintrag vorhanden.

Detailierte Informationen hierzu kannst du dir in der PHP Dokumentation nachschlagen:
http://de.php.net/manual/de/function.fopen.php

Grüße
Manuel.
 
Zurück