Mehrere "Tabellen" aus einer CSV Datei lesen

Da ich gerade etwas wenig Zeit habe: füge einfach folgende Methode zur Klasse Joinable hinzu:
PHP:
public function sort( $key ) {
  if ( !in_array( $key, $this->columns ) ) {
    return;
  }

  uksort( $this->rows, function ( $a, $b ) use ( $key ) {
    return strcmp( $a[ $key ], $b[ $key ] );
  });
}
 
Kein Thema! Du hast schon so wahnsinnig geholfen! Ohne dich wär ich sicher noch beim einlesen der Dateien ;)

Aber wie wende ich die dann an? =/

PHP:
$dateizeiger = file_get_contents('input/test.csv');
    $database = Database::parse($dateizeiger);
    $join = $database[ 'Benutzer' ]
        ->inner_join( $database[ 'Zuweisung Benutzer-Endgerät' ], [ 'Benutzer-ID' ] )
        ->inner_join( $database[ 'Endgerät' ],                    [ 'Endgerät-ID' ] )
        ->inner_join( $database[ 'Systemendgerätedaten' ],      [ 'Endgerät-ID' ] );
    
    $join->sort('Nummer');
    echo "<pre>";
    print_r($join->rows);
    echo "</pre>";

Habe es nun so eingebunden aber da ist alles total durcheinander mit =/

Tut mir leid wegen dieser ganzen total dämlichen Fragen :(
 
Fehler meinerseits: da muss usort() statt uksort() verwendet werden und dann geht das Ganze auch.
PHP:
public function sort( array $keys ) {
  # remove duplicate columns
   $keys = array_unique( $keys );
  # check if any passed colum name is not defined
   if ( empty( $keys ) || count( array_diff( $keys, $this->columns ) ) !== 0 ) {
    return $this;
  }

  $table = clone $this;

  # sort rows by columns
   usort( $table->rows, function ( $a, $b ) use ( $keys ) {
    foreach ( $keys as $key ) {
      # calculate difference
       $cmp = strcmp( $a[ $key ], $b[ $key ] );

      # break if column values differ
       if ( $cmp !== 0 ) {
        return $cmp;
      }
    }

    # all column values are equal
     return 0;
  });

  return $table;
}

PHP:
$database = Database::parse( file_get_contents( 'input/test.csv' ) );
$join = $database[ 'Benutzer' ]
  ->inner_join( $database[ 'Zuweisung Benutzer-Endgerät' ], [ 'Benutzer-ID' ] )
  ->inner_join( $database[ 'Endgerät' ],                    [ 'Endgerät-ID' ] )
  ->inner_join( $database[ 'Systemendgerätedaten' ],        [ 'Endgerät-ID' ] );

echo '<pre>';
print_r( $join->sort([ 'Nummer' ])->rows );
echo '</pre>';

PS: Man kann jetzt auch nach mehreren Spalten sortieren und wenn sortiert wird, dann wird eine Kopie der Tabelle zurück gegeben.
 
Zuletzt bearbeitet:
Super :) nu sortiert er alles richtig.
Mir ist allerdings nun noch ein einziges Problem aufgefallen, er gibt nicht alle Benutzer aus wobei ich auch genau weiß wodran es liegt.

In der Tabelle 162 Endgeräte gibt es 3 Spalten: Endgerät-ID, Beschreibung und Endgerättyp
Wichtig sind in meinem Fall die Endgerät-ID und der Endgerättyp.
Der Endgerättyp hat in meinen CSV Daten 4 verschiedene Werte.
0 = System DECT-Telefone
7 = System Tischtelefone
5 = Analoges Endgerät
6 = ISDN Engerät

Durch den Join mit der Tabelle 168 Systemendgerätedaten gehen die Endgeräte (und entsprechend die dazugehörenden Benutzer) verloren, welche keine Daten in der Tabelle 168 haben. In Tabelle 168 haben nur die Endgerätetypen 0 und 7 etwas stehen (evtl. gibt es auch noch andere Typen vom Hersteller die dort zugreifen, welche zur Zeit einfach nur in meinen CSV-Daten nur nicht enthalten sind).

Gibt es eine Möglichkeit das Problem zu beheben, dass er alle Benutzer ausgibt oder stößt das Script dort endgültig an seine Grenzen? :)

Ich hoffe das Problem ist verständlich. Hier noch mal ein Beispieldatensatz wo genau die Situation drin enthalten ist:
Code:
/TABLE;Benutzer;162
/FIELDS
Benutzer-ID;Nummer;Name
1;10;Digital 1
2;11;Digital 2
3;13;DECT 1
4;14;DECT 2
5;15;DECT 3
6;19;Analog 1
//END OF TABLE;Benutzer;162
/TABLE;Endgerät;163
/FIELDS
Endgerät-ID;Beschreibung;Endgerättyp
1;Digital 1;7
2;Digital 2;7
3;DECT 1;0
4;DECT 2;0
5;DECT 3;0
6;Analog 1;5
7;ISDN EG;6
//END OF TABLE;Endgerät;163
/TABLE;Zuweisung Benutzer-Endgerät;164
/FIELDS
Benutzer-ID;Endgerät-ID
1;1
2;2
2;7
3;3
4;4
5;5
6;6
//END OF TABLE;Zuweisung Benutzer-Endgerät;164
/TABLE;Systemendgerätedaten;168
/FIELDS
Endgerät-ID;Typ konfiguriert
1;23
2;23
3;20
4;19
5;8
//END OF TABLE;Systemendgerätedaten;168
 
Einerseits brauchst Du da einen anderen JOIN, andererseits hatte ich LEFT und RIGHT JOIN genau vertauscht implementiert, was ich jetzt aber behoben habe.
PHP:
$database = Database::parse( file_get_contents( 'input/test.csv' ) );
$join = $database[ 'Benutzer' ]
  ->inner_join( $database[ 'Zuweisung Benutzer-Endgerät' ], [ 'Benutzer-ID' ] )
  ->inner_join( $database[ 'Endgerät' ],                    [ 'Endgerät-ID' ] )
  ->left_join(  $database[ 'Systemendgerätedaten' ],        [ 'Endgerät-ID' ] );

echo '<pre>';
print_r( $join->sort([ 'Nummer' ])->rows );
echo '</pre>';

PS: Die Methode ->sort() wurde auch noch erweitert: man kann jetzt die Sortierrichtung angeben:
PHP:
# 'column1' wird aufsteigend sortiert (default: asc)
# 'column2' wird aufsteigend sortiert (asc = ascending = aufsteigend)
# 'column3' wird absteigend sortiert (desc = descending = absteigend)
$table->sort([ 'column1', 'column2' => 'asc', 'column3' => 'desc' ]);
 

Anhänge

  • multi-table-csv-7.zip
    6,3 KB · Aufrufe: 4
Habe ich doch gerne gemacht. Und es gibt sogar einiges, was ich dabei selber neu gelernt habe, zumindest über die Funktionen von PHP. Die Sprache ist zwar an sich Grütze, aber manches kann man dann doch mit ihr anfangen.
 

Neue Beiträge

Zurück