CSV Datei einlesen, OOP anwenden und Array ausgeben

Ensaw

Mitglied
Hallo,

und zwar bin ich gerade dabei eine .csv Datei in PHP einlesen zu lassen.
Die .csv Datei hat um die 100 Zeilen und ca. 10 Spalten.

Ich möchte gerne die .csv einlesen lassen, jede Spalte als Objekt speichern lassen. Beim Ausgeben soll die erste Zeile nicht beabsichtigt werden und nur 3 Spalten genommen werden.

Code:
PHP:
 <?php
         $csv_datei = "daten.csv";
         $feler_trenner = ";";
         $zeilen_trenner = "\r\n";
         if (@file_exists($csv_datei) == false) {
             echo 'Die CSV Datei: '. $csv_datei.' gibt es nicht!';
         } 
         else 
         {
             $datei_inhalt = @file_get_contents($csv_datei);
             $zeilen = explode($zeilen_trenner, $datei_inhalt);
             $anzahl_zeilen = count($zeilen);
             if (is_array($zeilen) == true) {
                 foreach($zeilen as $zeile) {
                     $felder = explode($feler_trenner, $zeile);
                     $i = 0;
                     if (is_array($felder) == true) {
                         foreach($felder as $felde) {
                             if ($felde != '') {
                                 echo (($i != 0) ? ', ':''). str_replace('"','', $felde);
                                 $i++;
                             }
                         }
                     }
                     echo '<br>';
                 }
             }
         }
     ?>

Wie kann ich dort jede Zeile als Objekt speichern und nur bestimmte Spalten ausgeben?
 
PHP:
<?php

class Something
{
    public $one;
    public $two;
    public $three;
    public $four;
    public $five;
    public $six;
    public $seven;
    public $eight;
    public $nine;
    public $ten;
}

$csvData = <<<EOT
"a1","a2","a3","a4","a5","a6","a7","a8","a9","a10"
"b1","b2","b3","b4","b5","b6","b7","b8","b9","b10"
"c1","c2","c3","c4","c5","c6","c7","c8","c9","c10"
"d1","d2","d3","d4","d5","d6","d7","d8","d9","d10"
"e1","e2","e3","e4","e5","e6","e7","e8","e9","e10"
"f1","f2","f3","f4","f5","f6","f7","f8","f9","f10"
"g1","g2","g3","g4","g5","g6","g7","g8","g9","g10"
"h1","h2","h3","h4","h5","h6","h7","h8","h9","h10"
"i1","i2","i3","i4","i5","i6","i7","i8","i9","i10"
"j1","j2","j3","j4","j5","j6","j7","j8","j9","j10"
"k1","k2","k3","k4","k5","k6","k7","k8","k9","k10"
EOT;

$h = fopen('data://text/plain;base64,' . base64_encode($csvData), 'rb');

$objs = array();

while ($entry = fgetcsv($h, 0, ',', '"', '\\')) {
    $tmp = new Something();

    $tmp->one   = $entry[0];
    $tmp->two   = $entry[1];
    $tmp->three = $entry[2];
    $tmp->four  = $entry[3];
    $tmp->five  = $entry[4];
    $tmp->six   = $entry[5];
    $tmp->seven = $entry[6];
    $tmp->eight = $entry[7];
    $tmp->nine  = $entry[8];
    $tmp->ten   = $entry[9];

    $objs[] = $tmp;
}

fclose($h);

$c = count($objs);

for ($i = 1; $i < $c; $i++) {
    printf("%s, %s, %s\n", $objs[$i]->one, $objs[$i]->two, $objs[$i]->three);
}

Das data-Protokoll musst du natürlich nicht nutzen. Das habe ich hier nur gewählt, damit alle Daten des Beispiels in einer Datei stehen können.
 
Ja schon, nur wenn ich dort
PHP:
$h = fopen('C:/Work/Projekte/datei.csv' . base64_encode($csvData), 'rb');
eingebe, bekomme ich folgene Fehler:

Warning: fopen(C:/Work/Projekte/datei.csvImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsImExMCINCiJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiMTAiDQoiYzEiLCJjMiIsImMzIiwiYzQiLCJjNSIsImM2IiwiYzciLCJjOCIsImM5IiwiYzEwIg0KImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwiZDgiLCJkOSIsImQxMCINCiJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlMTAiDQoiZjEiLCJmMiIsImYzIiwiZjQiLCJmNSIsImY2IiwiZjciLCJmOCIsImY5IiwiZjEwIg0KImcxIiwiZzIiLCJnMyIsImc0IiwiZzUiLCJnNiIsImc3IiwiZzgiLCJnOSIsImcxMCINCiJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJoNyIsImg4IiwiaDkiLCJoMTAiDQoiaTEiLCJpMiIsImkzIiwiaTQiLCJpNSIsImk2IiwiaTciLCJpOCIsImk5IiwiaTEwIg0KImoxIiwiajIiLCJqMyIsImo0IiwiajUiLCJqNiIsImo3IiwiajgiLCJqOSIsImoxMCINCiJrMSIsImsyIiwiazMiLCJrNCIsIms1IiwiazYiLCJrNyIsIms4IiwiazkiLCJrMTAi) [function.fopen]: failed to open stream: Invalid argument in C:\Work\Projekte\exceldatei.php on line 31

Warning: fgetcsv() expects parameter 1 to be resource, boolean given in C:\Work\Projekte\exceldatei.php on line 35

Warning: fclose() expects parameter 1 to be resource, boolean given in C:\Work\Projekte\exceldatei.php on line 52
 
Hast du nur annähernd eine Ahnung, was dieser Code tut?

...
a)
Dieser Block kommt weg:
PHP:
$csvData = <<<EOT
"a1","a2","a3","a4","a5","a6","a7","a8","a9","a10"
"b1","b2","b3","b4","b5","b6","b7","b8","b9","b10"
"c1","c2","c3","c4","c5","c6","c7","c8","c9","c10"
"d1","d2","d3","d4","d5","d6","d7","d8","d9","d10"
"e1","e2","e3","e4","e5","e6","e7","e8","e9","e10"
"f1","f2","f3","f4","f5","f6","f7","f8","f9","f10"
"g1","g2","g3","g4","g5","g6","g7","g8","g9","g10"
"h1","h2","h3","h4","h5","h6","h7","h8","h9","h10"
"i1","i2","i3","i4","i5","i6","i7","i8","i9","i10"
"j1","j2","j3","j4","j5","j6","j7","j8","j9","j10"
"k1","k2","k3","k4","k5","k6","k7","k8","k9","k10"
EOT;

b)
PHP:
$h = fopen('C:/Work/Projekte/datei.csv', 'rb');
 
Ich bin noch recht unerfahren mit PHP, deswegen muss ich noch eine menge lernen.

Nun bekomme ich recht viele Fehler mit
"Notice: Undefined offset: 1 in C:\Work\Projekte\exceldatei.php on line 22"

und das geht bis "offset: 9" "on line 33"

Das ist der Abschnitt mit den Variablen $tmp.
 
Mit Fehlermeldungen zu arbeiten ist nicht sprachenspezifisch.

Mögliche Lösungsansätze sind:

a) Fehlermeldung suchen und lerne, was der eigentliche Grund ist
b) Debuggen (welche Werte haben die Variable, äußere Umstände protokollieren).

Undefined Offset bei Arrays. Kannst du dir vorstellen was das heißt? Undefined = "Undefiniert; nicht gesetzt" und Offset = "Absetzung; Verschiebung; (hier: Position; Index)".
 

Neue Beiträge

Zurück