Zeilen zählen und bestimmte Anzahl ausgeben

Fonsi-Heizer

Mitglied
Hallo Leute!

Ich versuche derzeit aus einer großen CSV Datei einzelne Bereiche auszulesen.
Die CSV Datei hat folgende Struktur:

Code:
MATCH NR.;STATUS;PLAYER 1;PLAYER 2;SCORE
1;Finished;STOLKA Harald (DE);CORSO Massimiliano (IT);7:1
2;Finished;ASCHAUER Thomas (AT);LECHNER Machimilian (AT);8:1
3;Finished;WINDL Robert (AT);PUTNIK Ivica (HR);9:1
4;Finished;MARKUT Alexander (AT);HIMMELBAUER Andi (AT);10:1
5;Running;BENVENUTO Antonio (IT);BAZZANA Stefano (IT);11:1
6;Waiting;HUBER Richard (AT);ERCULJ Matjaz (SI);12:1
7;Finished;SOMMEREGGER Rene (AT);HUBER Stefan (AT);13:1
8;Finished;KULOYANTS Valery (DE);WORUNG Jimmy (NL);14:1
9;Finished;ECKERT Ralph (DE);SCHÖPF Daniel (DE);15:1
10;Finished;HOISS Tobias (DE);FARINA Gordon (AT);16:1
MATCH NR.;STATUS;PLAYER 1;PLAYER 2;SCORE
5;Running;BENVENUTO Antonio (IT);BAZZANA Stefano (IT);11:1
6;Waiting;HUBER Richard (AT);ERCULJ Matjaz (SI);12:1
MATCH NR.;STATUS;PLAYER 1;PLAYER 2;SCORE
7;Finished;SOMMEREGGER Rene (AT);HUBER Stefan (AT);13:1
8;Finished;KULOYANTS Valery (DE);WORUNG Jimmy (NL);14:1
9;Finished;ECKERT Ralph (DE);SCHÖPF Daniel (DE);15:1
10;Finished;HOISS Tobias (DE);FARINA Gordon (AT);16:1

Laut meinem PHP Skript, wo mir bereits hier schon geholfen wurde, überspringt dieser die erste Zeile.
Nun möchte ich explizit, vom ersten Datensatz Zeile 2-11 auslesen, vom zweiten Datensatz 12 überspringen, 13-14 auslesen usw.

Oder gibt es eine Möglichkeit, sobald das Script den gleichen text wie in Zeile 1 vorfindet, die Abfrage zu beenden? In meiner Recherche bin ich auch schon fündig geworden das es mit dem PHP Befehl
PHP:
if (($handle = fopen("companies.csv", "r")) !== FALSE) {
    while  (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);
zusammenhängen dürfte. Aber ich finde keine funktionierende Lösung dies anzupassen!

Hier noch der gesamte PHP Skript:

PHP:
<?php
$row = 1;

if (($handle = fopen("companies.csv", "r")) !== FALSE) {
    while  (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);

        for ($c=0; $c < $num; $c++) {
            //echo $data[$c] . "<br />\n";
            if(empty($data[$c])) {
               $value = "&nbsp;";
            }
              else{
               $value = $data[$c];
            }
              if ($row == 1) {
            }
              else{
               if($value=="Finished"){
                echo '<td class="footable-visible" data-value="1">';
                echo '<span class="status-metro status-finished" title="Finished">'.$value.'</span></td>';
            }
              else {
                if($value=="Waiting"){
                echo '<td class="footable-visible" data-value="0">';
                echo '<span class="status-metro status-waiting" title="Waiting">'.$value.'</span></td>';
            }
             else {
                if($value=="Running"){
                echo '<td class="footable-visible" data-value="2">';
                echo '<span class="status-metro status-running" title="Running">'.$value.'</span></td>';
            }
             else{
                echo '<td class="Alle anderen">'.$value.'</td>';
            }
          }
        }
      }
    }


        if ($row == 1) {
            echo '<tbody>';
        }else{
            echo '</tr>';
        }
        $row++;
    }
    echo '</tbody></table>';
    fclose($handle);
}
?>

Danke für Eure tolle Unterstützung und Hilfestellung, auch für Anfänger wie mir!
Schönes Wochenende, LG Flo
 
Ich würde es so lösen:
PHP:
$handle  = fopen( 'companies.csv', 'r' );
$entries = array();

if ( $handle !== false ) {
    while ( $data = fgetcsv( $handle, 1000, ';' ) ) {
        if ( !is_numeric( $data[0][0] ) ) {
            continue;
        }

        $entries[] = $data;
    }

    fclose( $handler );
}

$entries = array_unique( $entries, SORT_REGULAR );

foreach ( $entries as $entry ) {
    list( $match_id, $status, $player_1, $player_2, $score ) = $entry;

    # do something
}
 
Hallo!

Danke schon einmal.

Nur für mich, damit ich diesen Skript auch richtig analysieren und interpretieren kann.

Du liest jetzt die Daten aus und sagst Ihm wenn der "Header" wieder kommt, dann neu anfangen oder?
Weiters willst du eine Liste ausgeben, oder verstehe ich das Falsch?
Ich müsste statt der Liste eine Tabelle daraus ausgeben.

Würde es nicht reichen einfach bei fgetcsv eine Zeilenbegränzung einzugeben, bzw. gibt es so eine Funktion?

LG
 
@Fonsi-Heizer : Der "Trick" ist zunächst mal, alle Zeilen, die wirklich Werte enthalten, in ein Array zu speichern. Damit kann man in PHP einfach viel besser arbeiten und auch die Ausgabe entsprechend gestalten. Hier wurde das so gelöst, dass einfach geprüft wird, ob die erste Spalte eine Nummer enthält (MATCH NR.), und nicht etwa eine Kopfzeile darstellt - eigentlich eine elegante Lösung, da die Kopfzeilen zufällig aufzutreten scheinen. Nach dem ersten Schritt sind dementsprechend im Array $entries alle deine Daten, zum besseren Verständnis einfach mal ausgeben lassen, etwa mit var_dump($entries);

Was du danach damit machst, ist egal. Wieder bezogen auf das Beispiel werden zunächst doppelte Einträge aus dem Array entfernt:
PHP:
$entries = array_unique( $entries, SORT_REGULAR );

In der foreach Schleife kannst du dann eigentlich genau deinen Code reinkopieren, den du vorher zur Ausgabe verwendet hast. Die folgenden Variablen stehen dir zur Verfügung: $match_id,$status,$player_1,$player_2,$score. Das "echo ...." soltle dementsprechend erst in der foreach-Schleife kommen.
Dieses Prinzip wird allgemein auch EVA - Eingabe Vearbeitung Ausgabe - genannt: http://php-de.github.io/jumpto/eva-prinzip/
 
Hallo @einfach nur crack!

Habe nun den Script soweit für meine Bedürfnisse angepasst, dass nun der erste Datensatz angezeigt wird.

PHP:
<?php
$handle  = fopen( 'companies.csv', 'r' );
$entries = array();
if ( $handle !== false ) {
  while ( $data = fgetcsv( $handle, 1000, ';' ) ) {
  if ( !is_numeric( $data[0][0] ) ) {
  continue;
  }
  $entries[] = $data;
  }
  fclose( $handler );
}
$entries = array_unique( $entries, SORT_REGULAR );
foreach ( $entries as $entry ) {
  list( $match_id, $status, $player_1, $player_2, $score ) = $entry;
{
  echo '<tbody>';
  echo '<tr>';
}
   if ($row == 1) {
  }
  else{
  echo '<td>'.$match_id.'</td>';
 
  }

  if ($row == 2) {
  }
  else{
  if($status=="Finished"){
  echo '<td class="footable-visible" data-value="1">';
  echo '<span class="status-metro status-finished" title="Finished">'.$status.'</span></td>';
  }
  else {
  if($status=="Waiting"){
  echo '<td class="footable-visible" data-value="0">';
  echo '<span class="status-metro status-waiting" title="Waiting">'.$status.'</span></td>';
  }
  else {
  if($status=="Running"){
  echo '<td class="footable-visible" data-value="2">';
  echo '<span class="status-metro status-running" title="Running">'.$status.'</span></td>';
  }
  else{
  echo '<td class="Alle anderen">'.$status.'</td>';
 
  }
 
  }
  }
  }

if ($row == 1) {
  }
  else{
  echo '<td>'.$player_1.'</td>';
}
if ($row == 1) {
  }
  else{
  echo '<td>'.$player_2.'</td>';
}
if ($row == 1) {
  }
  else{
  echo '<td>'.$score.'</td>';
     echo '</tr>';

}
}
 
?>

Jedoch habe ich noch immer das Problem, wenn ich diesen kopiere und dann abändern möchte das er den zweiten Datensatz nehmen soll, schaffe ich das nicht.
Ich schätze es liegt an dieser Zeile oder?
PHP:
  if ( !is_numeric( $data[0][0] ) ) {

LG
 
Zuletzt bearbeitet:
Was mich bei Deinem Skript dezent stört, ist, dass Du eine Variable $row verwendest, die nirgendwo definiert wird. Dementsprechend werden auch alle Bedingungen damit fehlschlagen. Wäre es möglich, dass Du uns mal aufgemalt zeigst, wie die Tabelle am Ende aussehen soll, damit wir Dir da helfen können? Momentan werde ich da aus Deinem Skript nicht schlau.
 
Hallo @einfach nur crack!

Gerne. -> Es sollte dann so aussehen: open.kugelrund.at/livescore/daten/Raster_Salzburg_open/open2015/daten/test.php

unter se-16 sollte dann der zweite Datensatz erscheinen, unter SE-8 der dritte usw.

Ich könnte auch einzelne .csv Dateien machen und diese alle einzeln öffnen und auslesen,
wollte dies aber so performant wie möglich gestalten und daraus nur eine CSV-Datei haben!
 
Ich denke, das folgende wäre eine bessere Lösung für Dein Problem:
PHP:
$handle = fopen( 'companies.csv', 'r' );
$entries = array();

if ( $handle !== false ) {
    while ( $data = fgetcsv( $handle, 1000, ';' ) ) {
        if ( !is_numeric( $data[0][0] ) ) {
            continue;
        }

        $entries[] = $data;
    }

    fclose( $handler );
}

$entries = array_unique( $entries, SORT_REGULAR );
$content = '<tbody>';

foreach ( $entries as $entry ) {
    list( $match_id, $status, $player_1, $player_2, $score ) = $entry;

    $content .= '<tr>' . PHP_EOL;
    # match-id
    $content .= '  <td>' . $match_id . '</td>' . PHP_EOL;

    # status
    switch ( $status ) {
        case 'Finished':
            $content .= '  <td class="footable-visible" data-value="1">' . PHP_EOL;
            $content .= '    <span class="status-metro status-finished" title="Finished">Finished</span>' . PHP_EOL;
            $content .= '  </td>' . PHP_EOL;
        break;

        case 'Waiting':
            $content .= '  <td class="footable-visible" data-value="0">' . PHP_EOL;
            $content .= '    <span class="status-metro status-waiting" title="Waiting">Waiting</span>' . PHP_EOL;
            $content .= '  </td>' . PHP_EOL;
        break;

        case 'Running':
            $content .= '  <td class="footable-visible" data-value="2">' . PHP_EOL;
            $content .= '    <span class="status-metro status-running" title="Running">Running</span>' . PHP_EOL;
            $content .= '  </td>' . PHP_EOL;
        break;

        default:
            $content .= '  <td title="Alle anderen">' . $status . '</td>' . PHP_EOL;
        break;
    }

    # player 1
    $content .= '  <td>' . $player_1 . '</td>' . PHP_EOL;

    # player 2
    $content .= '  <td>' . $player_2 . '</td>' . PHP_EOL;

    # score
    $content .= '  <td>' . $score . '</td>' . PHP_EOL;

    $content .= '</tr>';
}

$content .= '</tbody>';

echo $content;
 
Zurück