CSV einlesen in array

Hallo

ich suche nach einer möglichkeit eine CSV Datei

Saison    Verband    Spielgebiet    Mannschaftsart    Staffel    Spielstätte    Spielstätten-Nr.    Straße    PLZ    Ort    Platznummer    Typ    Größe    Max. parallele Spiele    Max. Spiele/Tag    Max. Spiele/Wochenende    Früheste Anstoßzeit    Späteste Anstoßzeit    Mittagspause    Wochentag    Spieldatum    Uhrzeit    Sptg.    Spielkennung    Typ    Liga    Heimmannschaft    Gastmannschaft    Spielleitung    Assistent 1    Assistent 2    SpielleitungAusweisnr.    Assistent 1Ausweisnr.    Assistent 2Ausweisnr.    SpielleitungSchirigebiet    Assistent 1Schirigebiet    Assistent 2Schirigebiet
15/16    Sächsischer Fußball-Verband    Kreis Leipzig    D-Junioren    Stadtliga    Tapfer Großfeld 1    6300317411    Torgauer Str. 106    04318    Leipzig        Rasenplatz    ganzer Platz    1    4    8    09:00    19:00     -     Sa    05.09.2015    09:00    1    638149006    Meisterschaft    D-Junioren Kreisoberliga    SV Tapfer 06 Leipzig I    Leipziger SC 1901 I    Januszewski, Jonas Paul            631000003174            Kreis Leipzig        
15/16    Sächsischer Fußball-Verband    Kreis Leipzig    D-Junioren    1.Kreisklasse Staffel II    Tapfer Großfeld 1    6300317411    Torgauer Str. 106    04318    Leipzig        Rasenplatz    ganzer Platz    1    4    8    09:00    19:00     -     Sa    05.09.2015    09:00    1    638144206    Meisterschaft    D-Junioren 1.Kreisklasse    SV Tapfer 06 Leipzig II    FC Eintracht Holzhausen 93 I    Messer, Bodo            630005270656            Kreis Leipzig        
15/16    Sächsischer Fußball-Verband    Kreis Leipzig    E-Junioren    1.Kreisklasse Staffel II    Tapfer Kleinfeld    6300317413    Torgauer Str. 106    04318    Leipzig        Rasenplatz    ganzer Platz    1    5    8    09:00    19:00     -     Sa    05.09.2015    09:00    1    638153204    Meisterschaft    E-Junioren 1.Kreisklasse    SV Tapfer 06 Leipzig II    BSG Chemie Leipzig I    Schwentke, Leon            631000004122            Kreis Leipzig        
15/16    Sächsischer Fußball-Verband    Kreis Leipzig    E-Junioren    Stadtklasse    Tapfer Kleinfeld    6300317413    Torgauer Str. 106    04318    Leipzig        Rasenplatz    ganzer Platz    1    5    8    09:00    19:00     -     Sa    05.09.2015    10:30    1    638151004    Meisterschaft    E-Junioren Kreisliga A    SV Tapfer 06 Leipzig I    VfB Zwenkau 02 I    Januszewski, Jonas Paul            631000003174            Kreis Leipzig        
15/16    Sächsischer Fußball-Verband    Kreis Leipzig    B-Junioren    Stadtliga    Tapfer Großfeld 1    6300317411    Torgauer Str. 106    04318    Leipzig        Rasenplatz    ganzer Platz    1    4    8    09:00    19:00     -     So    06.09.2015    10:30    1    638120004    Meisterschaft    B-Junioren Kreisoberliga    SV Tapfer 06 Leipzig I    SV Mölkau 04 I    Thießen, Felix            631000003863            Kreis Leipzig        
15/16    Sächsischer Fußball-Verband    Kreis Leipzig    

in ein Array einzulesen, das ich abfragen kann

zeile 1 in Spalte „Spieldatum“ und so weiter …

Danke für eure Hilfe
Gruß Mike

Hi Mike!

Spontan fällt mir das hier ein >> PHP: fgetcsv - Manual

Ansonsten hier mal durchschauen:
CSV Datei lesen - ÿþ - und jede Menge Leerzeichen werden gelesen
CSV Datei voom EMU Datenlogger einlesen

Grüße,
Chris

hi,

siehe auch hier (str_getCSV)

hardlog

Hallo

danke für die schnellen Antworten. Leider raff ich das nicht… Könnte mir jemand einen Codeschnippsel als Ansatz Posten?

Vielen Dank

Aus deiner Antwort lässt sich gut erkennen, dass du es maximal 1 Minute probiert hast…wenn überhaupt… :rolleyes:

Klick mal auf den 1. Foren-Link den ich geposted habe, da ist direkt dein gewünschter „Codeschnipsel“ in Beitrag #8

Edit: Bzw. einfach mal im PHP Manuel Link ein wenig nach unten scrollen :wink:

Grüße,
Chris

Hallo Chris,

hab mich nun mal versucht etwas länger damit auseinander zu setzen… Hab den „Codeschnipsel“ meiner angepasst.


<?
$spielplan = "D:\IP-Symcon\\media\\Spielplan(1).csv";
$csv_datei = fopen($spielplan, "r");
$i = 0; /*Soll Zähler werden*/
while (!feof($csv_datei))
   {
      $spiel = fgets($csv_datei);
      $spiel = trim($spiel);
      
      echo"spiel  ".$spiel."
";
  }
fclose($csv_datei);
?>

Nun ist die Frage … wie Frage ich die Variable $spiel ab ?


echo $spiel[2][4];

Hier bekomme ich fehlermeldung…

Gruß Mike

Nimm doch mal fgetCSV :wink:
Aber wie Chris schon schrieb, weiter unten auf der PHP Site ist sogar Code welcher die erste Zeile als Index einliest und die Daten passend als Array zuordnet. Einfach mal etwas runterscrollen bei den User Kommentaren.
Michael

Danke für eure schnellen Antworten. Langsam nähere ich mich meinem Ziel. Hier jetzt mein benutzter Code


<?php
    # Open the File.
    if (($handle = fopen("D:\IP-Symcon\\media\\Spielplan(1).csv", "r")) !== FALSE) {
        # Set the parent multidimensional array key to 0.
        $nn = 0;
        while (($data = fgetcsv($handle, 2000, "|")) !== FALSE) {
            # Count the total keys in the row.
            $c = count($data);
            # Populate the multidimensional array.
            for ($x=0;$x<$c;$x++)
            {
                $csvarray[$nn][$x] = $data[$x];
            }
            $nn++;
        }
        # Close the File.
        fclose($handle);
    }
    # Print the contents of the multidimensional array.
    print_r($csvarray);
?>

Ausgabe des Array´s


Array
(
    [0] => Array
        (
            [0] => ÿþSaison Verband ... .... ...
        )
    [1] => Array
        (
            [0] => 15/16 Säschsicher Fussballverband ... ... ...
        )

Ich hätte die ausgabe aber gern so:


Array
(
    [0] => Array
        (
            [0] => [b]ÿþ[/b]Saison Verband ... .... ...
        )
    [1] => Array
        (
            [0] => 15/16 
            [1] => Säschsicher Fussballverband 
            [2] => usw.
            [3] => usw
        )

Warum gibt er mir in [0][0] diese zeichen aus ? ÿþ
Vieleicht kann noch jemand helfen?

LG Mike

Eigentlich wird es mir langsam zu blöd nochmal zu antworten…aber keine Ahnung, ob es Mitleid oder was auch immer ist…

Bzgl. deines Zeichens > hab ich schon in Beitrag #2 etwas passendes verlinkt :rolleyes:
CSV einlesen in array

Wenn jemand etwas verlinkt, dann sollte man sich das auch anschauen! Meistens hat es einen Sinn…

Grüße,
Chris

Danke Chris…

leider verstehe ich als „Nicht Programierer“ das nicht wirklich. Ich versuche mich reinzufitzen eben so gut wie es geht…

Deinen geposteten link habe ich gelesen und habe daraus verstanden das es um die Codierung geht


while (!feof($csv_datei)) 
   { 
      $buffer = fgets($csv_datei); 
      $buffer = mb_convert_encoding($buffer, "UTF-8", "UTF-16"); 
      $buffer = trim($buffer); 
      echo"Buffer=".$buffer."
"; 
  } 
fclose($csv_datei);

Nur begreife ich eben nicht wann und wo ich es einbauen muss. Da ich kein Englich in der Schule hatte sondern nur Russisch muss ich mit Google Übersetzer klar kommen… was ein wenig schwierig ist.

Also falls ich Dich genervt habe tut mir leid.

Bitte Thema schliesen und versuche mein Glück dann woanders.

Gruß Mike


Array
(
    [0] => Array
        (
            [0] => [b]ÿþ[/b]Saison Verband ... .... ...
        )
    [1] => Array
        (
            [0] => 15/16 
            [1] => Säschsicher Fussballverband 
            [2] => usw.
            [3] => usw
        )


Nein, was du eigentlich möchtest ist das:


Array
(
    [0] => Array
        (
            [0] => Saison 
            [1] => Verband 
            [2] => ... .... ...
        )
    [1] => Array
        (
            [0] => 15/16 
            [1] => Säschsicher Fussballverband 
            [2] => usw.
            [3] => usw
        )

Denn deine CSV-Datei enthält in der ersten Zeile quasi deine Überschriften, ob ich die wirklich in die Datei schreiben würde sei mal dahin gestellt.
In Zeile 2 beginnt dann dein Inhalt, also Datenzeile 1, in dem Array ist ja wieder ein Array mit jeder Spalte. Anscheinend hast du den delimiter nicht richtig angegeben, denn er erkennt pro Datenzeile nur 1 Spalte und packt es deswegen alles zusammen.

Hallo Hagbard235

Danke für Deine Hinweise haben viel geholfen. Tatsächlich delimiter war Tabstop . Nun Muss ich nur noch die Codierung hinbekommen.
Diese scheint ANSI zu sein zumindest sagt mir das Excel. Mit dem Vorschlag von Chris bekomme ich nur Fehlermeldungen .

Danke erstmal
LG Mike

das du den Code nicht umbedingt gleich verstehst mag auch an der etwas komplexen Schreibweise liegen, ich vermute mal du hast es kopiert denn als Anfänger würde man es so nie schreiben. Mach doch erstmal folgendes mit deinem Code:


<?php
# Open the File.
$handle = fopen("D:\IP-Symcon\\media\\Spielplan(1).csv", "r");
# Abfragen ob das öffnen geklappt hat 
if (($handle) !== FALSE) {
    # Set the parent multidimensional array key to 0.
    $nn   = 0;
    $ende = false;
    ;
    while (($ende) == FALSE) {
        # Zeile lesen
        $data = fgetcsv($handle, 2000, "|");
        if ($data !== FALSE) {
            # Count the total keys in the row.
            $c = count($data);
            # Populate the multidimensional array.
            for ($x = 0; $x < $c; $x++) {
                $csvarray[$nn][$x] = $data[$x];
            }
            $nn++;
        } else {
            $ende = true;
        }
    }
    # Close the File.
    fclose($handle);
}
# Print the contents of the multidimensional array.
print_r($csvarray);
?>

Und wegen des Dateiformates nimmst du diesen Teil aus dem Posting von bayaro

 $buffer = mb_convert_encoding($buffer, "UTF-8", "UTF-16"); 
      $buffer = trim($buffer); 

nur muss der bei dir natürlich so aussehen

 $data= mb_convert_encoding($buffer, "UTF-8", "UTF-16"); 
      $data = trim($buffer); 

und gehört direkt unter

        if ($data !== FALSE) {
 

bei dir. Das versucht die Datei-enocodierung anzupassen und die Leerzeichen abzuschneiden. Beim 2. Parameter („UTF-16“) muss das Format rein, welches deine Datei hat, da vermutest du ja Ansi.

Welche es sein können kann man hier angucken: PHP: Supported Character Encodings - Manual
Wenn du es nicht weisst kannst du damit es auch von PHP ausgeben lassen:


echo mb_detect_encoding($data);

(käme dann auch an die Stelle nach dem if, wie oben

Das Problem ist nur, das dies ganze Codierungs-Geraffel darauf abzielt das du eine Zeile am Stück liest, das macht fgetcsv ja aber nicht, es teilt es ja auf Stücke schon auf,deswegen versuche mal folgendes (ohne zu testen ob es läuft getippt, musst ggf. selber nochmal nachbessern. Es liest die Datei erst Zeilenweise in Dataline und konvertiert die Zeile erst nach der Format-Änderung ins array mit str_getcsv.


<?php
# Open the File.
$handle = fopen("D:\IP-Symcon\\media\\Spielplan(1).csv", "r");
# Abfragen ob das öffnen geklappt hat 
if (($handle) !== FALSE) {
    # Set the parent multidimensional array key to 0.
    $nn   = 0;
    $ende = false;
    ;
    while (($ende) == FALSE) {
        # Zeile lesen ohne CSV-Convertierung
        $dataline = fgets($handle);
        if ($dataline !== FALSE) {
   # Enocding ausgeben, wenn hier was anderes als ANSI bei rauskommt diesen Wert 2 Zeilen tiefer eintragen
             echo mb_detect_encoding($dataline);            
   #  Encoding ändern
            $dataline= mb_convert_encoding($buffer, "UTF-8", "ANSI");
   # Leerzeichen abschneiden 
            $dataline = trim($buffer);
   # Zeile in CSV konvertieren, danach weiter wie vorher 
            $data = str_getCSV(, "|");

            # Count the total keys in the row.
            $c = count($data);
            # Populate the multidimensional array.
            for ($x = 0; $x < $c; $x++) {
                $csvarray[$nn][$x] = $data[$x];
            }
            $nn++;
        } else {
            $ende = true;
        }
    }
    # Close the File.
    fclose($handle);
}
# Print the contents of the multidimensional array.
print_r($csvarray);
?>

Hallo Hagbard235

Danke für Deine tolle ausführung, so konnte ich zumindest einen teil schon mal nachvollziehen. Mir macht leider die Codierung immer noch Probleme.
nach der Abfrage


echo mb_detect_encoding($data);

bekomme ich folgende ausgabe

UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8[b]ASCII[/b]

was ja heist das es schon UTF-8 ist bis auf die letzte „leere“ Zeile ?/String ?/Array ?. Leider werden mir aber extrem viele leerzeichen mitgegeben.


[0] => Array
        (
            [0] => S a i s o n 
            [1] => V e r b a n d
            [2] => M a n n s c h a f t s a r t 
            [3] => 

Mit

$dataline = trim($dataline, "ÿþ");

habe ich " ÿþ " am Zeilenbeginn 0 0 Saison entfernt.

Nun zu meinen offenen Fragen:
Wie bekomme ich die Leerzeichen raus damit ich abfragen kann

 IF($csvarray [1][3] == "D-Junioren"){
$spielzeit1 = (((35*60) * 2) + 10);
}

Warum ist der/das letzte string/array ASCII? Warscheinlich weil er leer ist?

Danke für eure mühen …
LG
Mike

So ich denk ich hab das Problem der Formatierung gelöst hier meine lösung:


<?php
$folder = "d:/IP-Symcon/media/"; // Haupterzeichnis
$allowed_files = array("csv"); // Erlaubte Dateiendungen.


////////////////////////////////////////////////////////////////////////////////

//$folder.=date('y/m/d/'); // Pfad zum aktuellen Verzeichnis
$dirs=array();
$files=array();

// Verzeichnis nach Unterverzeichnissen durchsuchen
if(is_dir($folder))
{
  $dir = opendir($folder);
  while($file = readdir($dir))
  {
    if( (is_file($folder.$file)) && strstr($file,".") )
    {
      $end=explode(".",$file);
      $end=strtolower($end[(count($end)-1)]);
      if(in_array($end,$allowed_files))
      {
        $filemtime=filemtime($folder.$file);
        $files[] = array($folder.$file,$filemtime);
      }
    }
  }
  closedir($dir);

  // Datein nach Datum sortieren
  usort($files, 'vergleich');
}

// Letzte Datei wiedergeben
if(count($files)>0) $CSVDATEI = $files[0][0];
else echo "Keine gültige Datei in diesem Verzeichnis";



function vergleich($wert_a, $wert_b)
{
  $a = $wert_a[1];
  $b = $wert_b[1];

  if ($a == $b) {
    return 0;
  }
  return ($a > $b) ? -1 : +1;
}echo $CSVDATEI;
# Open the File.
$handle = fopen("$CSVDATEI", "r");
# Abfragen ob das öffnen geklappt hat
if (($handle) !== FALSE) {

     # Set the parent multidimensional array key to 0.
    $nn   = 0;
    $ende = false;
    ;
    while (($ende) == FALSE) {
        # Zeile lesen
        $data = fgetcsv($handle, 2000, "	");
        if ($data !== FALSE) {
            $data = preg_replace('![^0-9 ^a-z ^A-Z \. \- \ß /	 \ö \ä \ü \"" :]!', '', $data);
                # Count the total keys in the row.
            $c = count($data);
            # Populate the multidimensional array.
            for ($x = 0; $x < $c; $x++) {
                $csvarray[$nn][$x] = $data[$x];
                     }
            $nn++;
        } else {
            $ende = true;
        }
    }
    # Close the File.
    fclose($handle);
}print_r ($csvarray);
?>

Ich habe einfach alles entfernt, was mich nicht Interresiert. Nun habe ich ein „Sauberes Array“.

LG Mike