Liste auf Doppelungen und fehlende Daten prüfen

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

ich habe heute zu lange auf den Code geschaut und zu oft neu probiert, so dass ich nun Ideen von außen brauche:
Gegeben ist eine Liste im csv-Format.
Diese beinhaltet die Werte "GRG1400001"-"GRG1499999".
In dieser Liste sind einige der Werte doppelt vorhanden, andere fehlen.
Es soll nun eine Liste erstellt werden, in der alle Werte aufsteigend sortiert vorhanden sind (ist schon in der csv gegeben). In der Spalte daneben soll stehen, ob der Wert vorhanden, doppelt vorhanden oder garnicht vorhanden ist.

Ich lese also die Datei ein und lasse sie zeilenweise ausgeben. Parallel läuft eine temporäre Variable mit, um ggf. fehlende Werte mit ausgeben zu lassen. Leider funktioniert das nicht, wenn mal ein oder zwei Werte nicht vorhanden sind.
Hat jemand eine einfachere Lösung? Ich sehe den Code vor lauter Buchstaben nicht mehr.

PHP:
$tmp = 1;

echo "<table><tr><td>Rechnung</td><td>Status</td></tr>";
if (($handle = fopen("ggr.csv", "r")) !== FALSE) 
{
  while (($data = fgetcsv($handle, 99999, ",")) !== FALSE)  
 
 {
  
 $dummy=intval(substr($data[0],5));  // nur Werte vergleichen, nicht Chars
  
 switch ($dummy)
 {
 
 case ($tmp==$dummy):
  
  echo "<tr><td>$data[0]</td><td>iO</td></tr>";
  $tmp++;
  break;
 
  case ($tmp>$dummy): // doppelt
  
  echo "<tr><td>$data[0]</td><td>doppelt</td</tr>";
 
  break;  
  case ($tmp<$dummy): // fehlt
  $tmp2=str_pad($tmp, 5 ,'0', STR_PAD_LEFT);  //mit Nullen auffüllen
 echo "<tr><td>GGR14".$tmp2."</td><td>fehlt</td></tr>";
 $tmp++;
  
  
  break;
 default:
 break;
 
  }
 
  }
}
echo "</table>";
  fclose($handle);
?>
 
Ungetestet:
PHP:
function csv_get_inconsistent_rows( $handle, $start = 1 ) {
  // collect affected rows (either occure never or more than once)
  $affected_rows = array();
  $last_index    = $start;

  while ( !feof( $handle ) ) {
    $data = fgetcsv( $handle, 99999, ',' );

    $current_index = (int) substr( $data[0], 5 );

    // same index as before
    if ( $current_index === $last_index ) {
      if ( !isset( $affected_rows[ $current_index ] ) ) {
        $affected_rows[ $current_index ] = 1;
      }

      // increment occurence of this index by 1
      ++$affected_rows[ $current_index ];
    // index is not the logical successor of the last index
    } elseif ( $current_index > $last_index + 1 ) {
      // create range of undefined indices
      $range         = range( $last_index + 1, $current_index - 1 );
      // append range to the affected rows and define their occurence as 0
      $affected_rows = array_merge( $affected_rows, array_fill_keys( $range, 0 ) );
    }
  }

  return $affected_rows;
}
 
Das sah ansich schon gut aus, allerdings bricht das Skript nach 30 Sekunden (timeout) ab. Bei ~700 Datensätzen sollte das eigentlich nicht der Fall sein.
 
Hi,

Möglichkeit 1: Timeout erhöhen.
Möglichkeit 2: Immer mal wieder Debug-Ausgaben bauen und das Ding Schritt für Schritt durchmessen, was da so lange dauert.

Grüsse,
BK
 
Zurück