Mehrere "Tabellen" aus einer CSV Datei lesen

Ja, ich programmier immer nur so "nebenbei" mal Kleinigkeiten um mir Sachen zu erleichtern... Das hier war dann doch komplizierter :)

Nun kämpfe ich gerade am Verbinden der einzelnen Arrays. Noch irgendeinen Vorschlag wie ich das am sinnvollsten löse? :)
 
Wie sollen die denn verbunden werden? INNER JOIN? LEFT JOIN? RIGHT JOIN? OUTER JOIN?

Nachtrag: Ich habe die Klassen etwas geändert und erweitert und Du kannst alle oben genannten JOIN-Arten jetzt anwenden:
PHP:
<?php
  $tables;

  $join1 = TableSet::inner_join(
    [ $tables['Benutzer'], 'Benutzer-ID' ],
    $tables['Zuweisung Benutzer-Endgerät']
  );
  $join2 = TableSet::inner_join(
    [ $tables['Endgerät'], 'Endgerät-ID' ],
    $join1
  );

  print_r($join2->get_rows());
 

Anhänge

  • multi-table-csv.zip
    1,5 KB · Aufrufe: 13
Zuletzt bearbeitet:
Ich programmiere eindeutig zu wenig :D das ist ja gruselig mit dir ;)

Ich werde es gleich mal testen wenn ich im Zug sitze und dann berichten :)

Vorallem als Klasse ist das genial, ich hätte mir das wieder nur so komisch zusammen gebastelt wie es wieder funktioniert hätte aber performance mäßig miserabel gewesen wäre ;)


Welchen Join würdest du denn empfehlen für meinen Zweck? Ich habe damit zwar schon bei MySQL gearbeitet und es hat geklappt, fragt sich nur wie sinnvoll die dann immer waren...
 
Ja ähm, nun habe ich es gesehen du hast ja schon den Vorschlag wie ich Joinen soll dazu getan :D

In Zeile 174 musste ich $table1->get_name() & $table2->get_name() jeweils durch get_table_name() ersetzen.

Allerdings kommen nun beim Ausführen andere Fehler.

Notice: Undefined offset: 0 in C:\xampp\htdocs\csv\multi-table-csv.php on line 176

Warning: array_keys() expects parameter 1 to be array, null given in C:\xampp\htdocs\csv\multi-table-csv.php on line 176

Catchable fatal error: Argument 3 passed to Table::__construct() must be of the type array, null given, called in C:\xampp\htdocs\csv\multi-table-csv.php on line 177 and defined in C:\xampp\htdocs\csv\multi-table-csv.php on line 8

Ich weiß was sie bedeuten, aber weg kriege ich sie nicht wirklich, dafür ist mir dein Script in der Tiefe doch zu hoch :D
 
Wie wäre es denn, die Daten tatsächlich in eine Datenbank zu importieren? (Evt auch sqlite oder so )
Dann wären JOIN uvm einfacher zu handlen - und das auslesen funktioniert ja schon (erstes Skript).
 
Ja da habe ich auch schon drüber nachgedacht, allerdings werden die Daten immer nur einmalig generiert und jedes mal am Ende müsste die DB gelöscht oder geleert werden. Macht da eine DB dann echt noch Sinn?
 
Ne, dann nicht wirklich. Grade wenn es auch nur bei den drei Tabellen mit verhältnismäßig wenig Daten bleibt.
Wie ist denn die Beziehung? Immer 1-zu-1 oder 1(Benutzer)-zu-n(Endgeräte) ?
 
Also größtenteils ist es 1-zu-1, es kann aber auch 1-zu-n geben.

Hier noch eine Beispiel mit 1-zu-n. in diesem Fall hat Benutzer-ID 2 noch ein weiteres Endgerät mit der ID 7 bekommen.
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

In den Tabellen gibt es teilweise noch erheblich mehr Felder, allderdings sind für mich für diesen Zweck nichtg von Relevanz und helfen auch nicht bei irgendwelchen Zurodnungen.


//EDIT
Ich habe mir nun mal einen der Joins aus dem Script angeguckt, kann es sein dass dort für den join noch die Werte für $map und $keys fehlen?
PHP:
public static function left_join( $def1, $def2 ) {
        return self::callback_join( $def1, $def2, function ( $map, $keys ) {
            foreach ( $map as $i => $row ) {
                if ( $row[0][$keys[0]] === null ) {
                    unset( $map[ $i ] );
                }
            }
          
            return $map;
        });
    }


//EDIT 2
Habe mir nun mal mit "print_r($join1->get_rows());" versucht den ersten Join auszugeben, dort kriege ich ein leeres Array zurück. Wahrscheinlich kommt daher dann auch der Fehler den ich oben schon mla gepostet habe, da beim zweiten Join natürlich dann keine Daten sind die er verarbeiten kann.
 
Zuletzt bearbeitet:
Ich habe das Ganze noch einmal überarbeitet und es entspricht jetzt auch eher der OOP-Idee als vorher, wo es teils zu funktional war. Jetzt sollte es gehen:
PHP:
<?php
  $tables;

  $join = $tables['Benutzer']
    ->inner_join( $tables['Zuweisung Benutzer-Endgerät'], [ 'Benutzer-ID' ] )
    ->inner_join( $tables['Endgerät'],                    [ 'Endgerät-ID' ] );

  print_r( $join->get_rows() );

Nachtrag: Ich habe meinen Code jetzt auf die Schnelle noch etwas aufgehübscht und einige unnötige Codezeilen entfernt und andere Sachen sauberer aufgeschrieben. So langsam gefällt mir mein eigener Code wieder :)

Nachtrag 2: Mir ist gerade aufgefallen, dass meine JOIN-Methoden nur eine 1-1-Relation umsetzen können. Da werde ich mir aber auch noch etwas einfallen lassen. Aber nicht mehr heute.
 

Anhänge

  • multi-table-csv-3.zip
    1,5 KB · Aufrufe: 19
Zuletzt bearbeitet:
Genial :)

Ich habe das ganze noch um die Systemendgeräte Tabelle erweitert, dadurch sieht es nun wie folgt aus:
PHP:
$join = $tables['Benutzer']
    ->inner_join( $tables['Zuweisung Benutzer-Endgerät'], [ 'Benutzer-ID' ] )
    ->inner_join( $tables['Endgerät'],                    [ 'Endgerät-ID' ] )
    ->inner_join( $tables['Systemendgerätedaten'],        [ 'Endgerät-ID' ] );

Die PDF Generierung funktioniert auch wunderbar mit den Daten :) lediglich die Umlaute funktionieren in der PDF nicht, aber da gucke ich noch wodran es liegt :)
 
Zurück