csv Datei auslesen


#1
Hallo Zusammen,
ich hab schon ewig nichtsmehr gemacht mit PHP aber jetzt brauch ich doch noch mal eure Hilfe.

Ich würde gerne eine csv Datei auslesen und anhanden ihrer Werte später in eine Datenbank schreiben.
Es geht aber nur um das auslesen und aufbereiten!

Die Datei ist so aufgebaut, jede Zeile hat immer 7 Werte:
Da ich die Zeilen immer überprüfen muss welche Felder Inhalte haben um sie als Überschrift, Artikeldaten, Mitgliederdaten zu identifizieren brauch ich das in einem Array wo ich immer die Werte prüfen kann und entsprechend dann ausgeben kann.
Vielleicht denke ich auch viel zu kompliziert :)
Code:
Blabla,,,,Tel.:,+43(052333)3566,
Strasse,,,,,,
2234 Ort,,,,,,
AUSTRIALPIN,,,,,,
Art-Nr.,Art-Nr. intern,Artikelbezeichnung,Grösse,Farbe,,
QE11K-NB,1779,Expressschlingenset,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Rudolf Haus,,19. April 2019,3,,,
ZS04RY-SET,ZS04RY-SET,DYNA.MIT 8er Set,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Michael Murks,,05. Mai 2019,1,,,
Beal,,,,,,
Art-Nr.,Art-Nr. intern,Artikelbezeichnung,Grösse,Farbe,,
BLDCO.40.80,BLDCO.40.80,Dynaconnexion,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Christoph Laps,,13. Mai 2019,1,,,
Fairrescue International,,,,,,
Art-Nr.,Art-Nr. intern,Artikelbezeichnung,Grösse,Farbe,,
17785,17785,Rucksackapotheke PEHP,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Günther Stümper,,14. Mai 2019,1,,,
14013,1820,Pflasterrolle,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Christoph Laps,,13. Mai 2019,1,,,
80497-E,1823,Wundverschlußstreifen,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Christoph Laps,,13. Mai 2019,5,,,
Kong,,,,,,
Art-Nr.,Art-Nr. intern,Artikelbezeichnung,Grösse,Farbe,,
997105N02KK,997105N02KK,Helm Kosmos Full,S/M,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Alina Schlawiner,,08. Mai 2019,1,,,
16. August 2019,,,,Seite 1 von4,,
Mammut Sports Group Austria GmbH,,,,,,
Art-Nr.,Art-Nr. intern,Artikelbezeichnung,Grösse,Farbe,,
2010-02770-,1710,Phoenix Halbseil 8 mm,2x60m,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Helmut Griestl,,23. April 2019,1,,,
2120-00601-,1714,"Dyneemaschlinge 30 cm, 8mm",30 cm,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Michael Scharms,,05. Mai 2019,2,,,
2120-00601-,1843,"Dyneemaschlinge 120 cm, 8 mm",120 cm,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Gerhard Merhard,,12. Mai 2019,2,,,
Michael Schrams,,05. Mai 2019,5,,,
2710-00140,1912,Mammut Barryvox S,,,,
Mitglied,,Bestellt am,Stück,Zusatz,Datum,Ausgeliefer
Helmut Zams,,23. April 2019,1,,,
Werner Wadler,,08. Mai 2019,1,,,
Folgendes möchte ich erreichen:
Ich würde gerne die Daten in einem Mehrdimensionalem Array speichern, Datensatz[zeile][wert1-7]

Ich habs bisher mit fgetscsv probiert aber ich kapier nicht ich ich das mehrdimensional hinbekomme:
Code:
$handle = fopen ('./files/datei.csv','r');

while (($csv_ary = fgetcsv ($handle, 1000, ',')) !== FALSE ) {

    if(!empty(trim($csv_ary[0]))) { echo $csv_ary[0]." / ";}
    if(!empty(trim($csv_ary[1]))) { echo $csv_ary[1]." / ";}
    if(!empty(trim($csv_ary[2]))) { echo $csv_ary[2]." / ";}
    if(!empty(trim($csv_ary[3]))) { echo $csv_ary[3]." / ";}
    if(!empty(trim($csv_ary[4]))) { echo $csv_ary[4]." / ";}
    if(!empty(trim($csv_ary[5]))) { echo $csv_ary[5]." / ";}
    if(!empty(trim($csv_ary[6]))) { echo $csv_ary[6]." / ";}
    echo "<br>";
 
}
fclose($handle);

?>
Wäre toll wenn mir wer helfen könnte, danke euch!!

Gruß
C
 

Sempervivum

Erfahrenes Mitglied
#2
Das ist wirklich ziemlich einfach: Du hast ja schon richtig erkannt, dass fgetcsv ein Array zurück liefert. Um ein zweidimensionales Array zu erzeugen, brauchst Du dieses nur zu dem endgültigen Array hinzuzufügen:
Code:
$handle = fopen('./files/datei.csv', 'r');
$arr_2dim = [];
while (($csv_ary = fgetcsv($handle, 1000, ',')) !== false) {
    var_dump($csv_ary);
    $arr_2dim[] = $csv_ary;
}
var_dump($arr_2dim);
fclose($handle);
 
#3
Danke Sempervivum, ich hatte das bereits selbst hinbekommen jetzt stecke ich aber schon wieder fest, und zwar wollte ich jetzt jeden Eintrag einer Prüfung unterziehen ob diese benötigt wird, leider ist das Ergebnis nicht so wie ich mir das vorgestellt habe.

Ich erklär mal kurz:
In jeder Zeile stehen gewisse Daten einmal sinds nur überschriften die sind dann nicht wichtig, einmal ist es der Lieferant oder der Mitgliedername

Dann gibts noch die Artikel und die Stückzahl.

Unterscheiden kann mann die Einträge durch die Felder die Ausgefüllt wurden

Wenn man sich die CSV Daten ansieht hat die Datei 7 Felder, wenn jetzt zb. das 1 Feld gefüllt ist und alle anderen Leer dann ist es der Eintrag Lieferant und diesen möchte ich verwenden, über diese Total unschöne Variante sollte es möglich sein alle Varianten zu identifizieren, leider kommt bei Test was anders raus als es sollte.

Hast du vielleicht noch eine Idee wie ich das hinbekomme, danke.


Code:
<?php

$handle = fopen ('./files/datei.csv','r');

while (($csv_ary = fgetcsv ($handle, 1000, ',')) !== FALSE ) {
    $zarray[] = $csv_ary;
}

//Anzahl Zeilen
echo count($zarray)."<br>";

foreach ($zarray as $key => $row) {
    echo "<br>Zeile:".$key."<br>";
    echo "Wert 0:".$row[0]."<br>";
    echo "Wert 1:".$row[1]."<br>";
    echo "Wert 2:".$row[2]."<br>";
    echo "Wert 3:".$row[3]."<br>";
    echo "Wert 4:".$row[4]."<br>";
    echo "Wert 5:".$row[5]."<br>";
    echo "Wert 6:".$row[7]."<br>";
    
    //Inhalt Zeile
    foreach ($row as $key1 => $zwert) {
        //echo $key1." -> ".$zwert."<br>";
        /*
        //Lieferant
        if(
        //Lieferant
        trim($zwert[0])!=="" AND trim($zwert[1])=="" AND trim($zwert[2])=="" AND trim($zwert[3])=="" AND    trim($zwert[4])=="" AND    trim($zwert[5])=="" AND    trim($zwert[6])=="")
        {
            echo "Lieferant: ";
        }elseif(
        //Mitglieder Header
        trim($zwert[0])!=="" AND trim($zwert[1])!=="" AND trim($zwert[2])==!"" AND trim($zwert[3])==!"" AND trim($zwert[4])!=="" AND trim($zwert[5])=="" AND    trim($zwert[6])=="")
        {
            echo "Mitglieder Header";
        }else
        {
            echo ".....";
        }*/
    }
}
echo "Ausgabe zarray <br>";
echo "<pre>";
   print_r($zarray);
echo "</pre>";

?>
 

Sempervivum

Erfahrenes Mitglied
#4
Da sehe ich folgenden Fehler: $zwert ist kein Array
Und einen (vermutlich Schreib-) Fehler bei dieser Abfrage:
trim($zwert[3])==!""
Wenn es relativ viele Varianten sind, würde ich empfehlen, die Werte nur einmal auf leer zu prüfen und dann die Varianten entweder in einem Switch abzufragen oder in einem Array abzulegen, etwa so (ungetestet):
PHP:
$variant = '';
foreach ($row as $key1 => $zwert) {
    if (trim($zwert) == "") $variant .= '0'; else $variant .= '1';
}
switch ($variant) {
    case '0000000':
        // Hier die Bearbeitung für die betr. Variante bzw. Kombi aus Werten
        break;
    case '1000000':
        // Hier die Bearbeitung für die betr. Variante bzw. Kombi aus Werten
        break;
    case '0100000':
        // Hier die Bearbeitung für die betr. Variante bzw. Kombi aus Werten
        break;
    // usw.
    default:
        // Hier die Bearbeitung wenn es um keine der zulässigen Varianten handelt
}
Da sind eine ganze Menge Varianten möglich und ich vermute, dass nicht alle zulässing sind.
 
Zuletzt bearbeitet:
#6
Ich habs jetzt mal in den Editor getippt, aber konnts noch nicht testen da ich derzeit keinen Zugang zum Server habe.

Hast du das so gemeint?
Ich hab jetzt alle Fälle die vorkommen können in einen Zahlencode umgewandelt, die Idee ist sehr geil :)

Code:
<?php

$handle = fopen ('./files/datei.csv','r');

while (($csv_ary = fgetcsv ($handle, 1000, ',')) !== FALSE ) {
    $zarray[] = $csv_ary;
}

//Anzahl Zeilen
echo count($zarray)."<br>";

foreach ($zarray as $key => $row) {
    echo "<br>Zeile:".$key."<br>";
    /*
    echo "Wert 0:".$row[0]."<br>";
    echo "Wert 1:".$row[1]."<br>";
    echo "Wert 2:".$row[2]."<br>";
    echo "Wert 3:".$row[3]."<br>";
    echo "Wert 4:".$row[4]."<br>";
    echo "Wert 5:".$row[5]."<br>";
    echo "Wert 6:".$row[7]."<br>";
    */
    
        //Inhalt Zeile
        $variant = '';
    foreach ($row as $key1 => $zwert) {
            if (trim($zwert) == "") $variant .= '0'; else $variant .= '1';
    }
    
    switch ($variant) {
            case '1000000':
                // Funktionen für Variante Lieferant
                break;
            case '1111100':
                // Funktionen für Variante Artikel Header
                break;
            case '1110000':
                   // Funktionen für Variante Artikel Details (Farbe, Grösse,..)
                break;
            case '1011111':
                   // Funktionen für Variante Mitglieder Header
                break;
            case '1011000':
                // Funktionen für Variante Mitglieder Details (Stückzahl, Datum,..)
                break;
            default:
                // Ausgabe wenn keine der 5 Varianten Stimmt
    }
}

echo "Ausgabe zarray <br>";
echo "<pre>";
   print_r($zarray);
echo "</pre>";

?>
 
#7
Konnte es kurz testen, leider ist aber in der switch dann im $zwert der wert nichtmehr vorhanden, diese müsste dann ja in eine Datenbank geschrieben werden.

Anbei das verwendete Script:
PHP:
<?php

$handle = fopen ('./files/datei.csv','r');

while (($csv_ary = fgetcsv ($handle, 1000, ',')) !== FALSE ) {
    $zarray[] = $csv_ary;
}

//Anzahl Zeilen
echo count($zarray)."<br>";

foreach ($zarray as $key => $row) {
    echo "<br>Zeile:".$key."<br>";
    /*
    echo "Wert 0:".$row[0]."<br>";
    echo "Wert 1:".$row[1]."<br>";
    echo "Wert 2:".$row[2]."<br>";
    echo "Wert 3:".$row[3]."<br>";
    echo "Wert 4:".$row[4]."<br>";
    echo "Wert 5:".$row[5]."<br>";
    echo "Wert 6:".$row[7]."<br>";
    */
        //Inhalt Zeile
        $variant = '';
    foreach ($row as $key1 => $zwert) {
            if (trim($zwert) == "") $variant .= '0'; else $variant .= '1';
    }
    
    switch ($variant) {
            case '1000000':
                // Funktionen für Variante Lieferant
                echo "Lieferant: ".$zwert."<br>";
                break;
            case '1111100':
                // Funktionen für Variante Artikel Header
                echo "Material Header: ".$zwert."<br>";
                break;
            case '1110000':
                   // Funktionen für Variante Artikel Details (Farbe, Grösse,..)
                echo "Material Details: ".$zwert."<br>";
                break;
            case '1011111':
                   // Funktionen für Variante Mitglieder Header
                echo "Mitglieder Header: ".$zwert."<br>";
                break;
            case '1011000':
                // Funktionen für Variante Mitglieder Details (Stückzahl, Datum,..)
                echo "Mitglieder Details: ".$zwert."<br>";
                break;
            default:
                // Ausgabe wenn keine der 5 Varianten Stimmt
                echo "Nichts passt: ".$zwert."<br>";
    }
}

echo "Ausgabe zarray <br>";
echo "<pre>";
   //print_r($zarray);
echo "</pre>";

?>
 

Sempervivum

Erfahrenes Mitglied
#8
leider ist aber in der switch dann im $zwert der wert nichtmehr vorhanden
Nein, $zwert ist nicht mehr vorhanden, wohl aber $zarray. Entscheiden, worum es sich handelt, kann Du ja erst, wenn alle sieben Werte abgearbeitet wurden und die Variante fest liegt. Ich bin davon ausgegangen, dass Du weißt, in welcher Spalte der betr. Wert steht, dann kannst Du ihn jederzeit aus $zarray abfragen:
$wertxyz = $zarray[4];(z. B.).
 
#9
Danke, ich habs mit $row bereits hinbekommen, jetzt haben sich aber ein paar andere Varianten ergeben die mir beim Anschauen der csv nicht aufgefallen sind, ich muss mir jetzt anschaeun ob ich die über einene neuen Code rausfiltern kann.

Danke inzwischen, ich vermute aber das ich nochmal lästig sein werde :)