Tab getrennte .txt auslesen, und bestimmte Teile ausgeben

barbiturator

Mitglied
Hallo,

ich bin mir bewusst, dass diese Anfrage, bei meinem PHP Kenntnisstand, schwierig umzusetzen sein wird, aber ich versuche es nichtsdestotrotz.

Learning by doing...

Ich habe mit Wordpress, für unsere Organisation, eine Art Intranet aufgesetzt, in dem man sich über Neuigkeiten, etc. informieren kann.
Nun soll der Dienstplan, einer Rettungswache, so eingebunden werden, dass ich ihn als .txt Datei auf der Seite hochladen kann -(Beispieldienstplan ist angehängt)- und er dann via PHP tageweise ausgegeben werden kann.

Die Ausgabe soll so erfolgen:
Für das jeweilige Datum, soll in der Spalte ausgelesen werden, welchem Namen eine Schicht zugeteilt ist, die mit 'Bo' beginnt, und falls dem so ist, soll der jeweilige Name ausgegeben werden.

Hier ist die txt Datei
 

Anhänge

Nicht ganz trivial

Ich habe hier mal ein möglicher Lösungsansatz erarbeitet. Die Beschreibung ist im Code. Dir unbekannte Methoden bitte zuerst in der Doku auf php.net (per Klick auf dem Befehl im Code) nachlesen und versuchen zu verstehen. Dann wenn das nicht fruchtet, hier nachfragen.
PHP:
<pre>
<?php 

//den tabulator als Trennzeiche definieren
define('C_DELIM', "\t");

//Testdaten
$filename = 'Dienstplan.txt';
$selectedSchicht = 'Bo';

//Zeilenfilter. Wenn die getrimmte Zeile keine Läng mehr hat - ignorieren
function lineFilter($line){
    return (strlen(trim($line)) > 1);
}
//Die Zeile in die Fleder aufteilen und jedes Feld noch mit trim() auf die wirkliche Grösse kürzen
function explodeLine($line){
    return array_map('trim', explode(C_DELIM, $line));
}
//Analog zu explodeLine. Jedoch wird der Array-Index mit der Heeaderzeile als Keys ergänzt
function explodeLineWithHeader($header, $line){
    $values = explodeLine($line);
    return array_combine($header, $values);
}


//Datei einlesen
$lines = file($filename);
//Leere Zeilen ausfiltern
$lines = array_filter($lines, 'lineFilter');

//Array der Kopfdaten erstellen
$header = explodeLine(array_shift($lines));

//Array mit den Aufnahemhäuesern erstellen (key = Kopfdaten)
$aufnahmehaus = explodeLineWithHeader($header, array_shift($lines));

//Zur späteren weiterverwednung alle User-Infos sammeln
$userInfos = array();
$userTermine = array();

$selected = array();
//Jede Datenzeile durchgehen
foreach($lines as $line){
    //Die Zeile mal in die Fleder aufteilen
    $row = explodeLineWithHeader($header, $line);
    //Die User-Infos extrahieren
    $userInfos[$row['Pers.-Nr.']] = $userInfo = array_slice($row, 0, 3, true);
    //Die Schichtzuteilungen auslesen
    $userTermine[$row['Pers.-Nr.']] = $userTermin = array_slice($row, 3, NULL, true);
    //Jeden Termin prüfen ...
    foreach($userTermin as $termin => $schicht){
        //... ob er mit $selectedSchicht beginnt 
        if(substr($schicht, 0, strlen($selectedSchicht)) == $selectedSchicht){
            //Wenn ja, in den Resultaten-Array schreiben
            $selected[$termin] = array(
                        'user'            => $userInfo['Pers.-Nr.'],
                        'aufnahmehaus'    => $aufnahmehaus[$termin]
            );

        }
    }
}
//Sortieren
ksort($selected);

echo "=== \$selected ===\n";
print_r($selected);

echo "=== \$userInfos ===\n";
print_r($userInfos);

echo "=== \$userTermine ===\n";
print_r($userTermine);

?>
</pre>

Ausgabe:
Code:
=== $selected ===
Array
(
    [01.06.2011] => Array
        (
            [user] => 1236
            [aufnahmehaus] => 3
        )

    [04.06.2011] => Array
        (
            [user] => 1237
            [aufnahmehaus] => 3
        )

    [07.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 3
        )

    [08.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 1
        )

    [11.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 1
        )

    [13.06.2011] => Array
        (
            [user] => 1235
            [aufnahmehaus] => 3
        )

    [24.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 2
        )

    [25.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 3
        )

    [28.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 3
        )

    [30.06.2011] => Array
        (
            [user] => 1238
            [aufnahmehaus] => 2
        )

)
=== $userInfos ===
Array
(
    [1234] => Array
        (
            [Nachname] => Musterfrau(RH)
            [Vorname] => Alina
            [Pers.-Nr.] => 1234
        )

    [1235] => Array
        (
            [Nachname] => Mustermann(RS)
            [Vorname] => Max
            [Pers.-Nr.] => 1235
        )

    [1236] => Array
        (
            [Nachname] => Doe(RS)
            [Vorname] => John
            [Pers.-Nr.] => 1236
        )

    [1237] => Array
        (
            [Nachname] => Minogue(RS)
            [Vorname] => Kylie
            [Pers.-Nr.] => 1237
        )

    [1238] => Array
        (
            [Nachname] => Wolf(RA)
            [Vorname] => Hans
            [Pers.-Nr.] => 1238
        )

)
=== $userTermine ===
Array
(
    [1234] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => UrA
            [07.06.2011] => UrA
            [08.06.2011] => UrA
            [09.06.2011] => UrA
            [10.06.2011] => UrA
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => 
            [14.06.2011] => UrA
            [15.06.2011] => UrA
            [16.06.2011] => UrA
            [17.06.2011] => UrA
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => UrA
            [21.06.2011] => 
            [22.06.2011] => 
            [23.06.2011] => 
            [24.06.2011] => 
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )

    [1235] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => 
            [08.06.2011] => 
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => Bo24
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => 
            [22.06.2011] => FW
            [23.06.2011] => 
            [24.06.2011] => FW
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => KTW
            [30.06.2011] => 
        )

    [1236] => Array
        (
            [01.06.2011] => BoN
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => 
            [08.06.2011] => 
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => 
            [13.06.2011] => 
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => 
            [22.06.2011] => 
            [23.06.2011] => zV
            [24.06.2011] => 
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )

    [1237] => Array
        (
            [01.06.2011] => KTW
            [02.06.2011] => 
            [03.06.2011] => KTW
            [04.06.2011] => Bo24
            [05.06.2011] => 
            [06.06.2011] => QM
            [07.06.2011] => 
            [08.06.2011] => Hö 24
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => 
            [12.06.2011] => Hö 24
            [13.06.2011] => 
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => HöT
            [19.06.2011] => 
            [20.06.2011] => KTW
            [21.06.2011] => KTW
            [22.06.2011] => FW
            [23.06.2011] => 
            [24.06.2011] => FW
            [25.06.2011] => 
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => 
            [29.06.2011] => 
            [30.06.2011] => 
        )

    [1238] => Array
        (
            [01.06.2011] => 
            [02.06.2011] => 
            [03.06.2011] => 
            [04.06.2011] => 
            [05.06.2011] => 
            [06.06.2011] => 
            [07.06.2011] => BoN
            [08.06.2011] => BoT
            [09.06.2011] => 
            [10.06.2011] => 
            [11.06.2011] => Bo24
            [12.06.2011] => 
            [13.06.2011] => 
            [14.06.2011] => 
            [15.06.2011] => 
            [16.06.2011] => 
            [17.06.2011] => 
            [18.06.2011] => 
            [19.06.2011] => 
            [20.06.2011] => 
            [21.06.2011] => FW
            [22.06.2011] => 
            [23.06.2011] => 
            [24.06.2011] => BoT
            [25.06.2011] => Bo24
            [26.06.2011] => 
            [27.06.2011] => 
            [28.06.2011] => BoN
            [29.06.2011] => 
            [30.06.2011] => Bo24
        )

)
 
Ich bin fasziniert.
Sehr gut beschrieben, sodass ich schon sehr weit durchgestiegen bin.
Ich weiß nun auch, dank deiner Beschreibung, wie ich andere Spalten auslesen kann, etc., das ist sehr gut.

Ist es möglich, dass ich, bei der Ausgabe der Tage, alle anzeigen lasse, die eine 'Bo' Schicht haben? Im Moment wird immer nur eine Person angezeigt, nämlich die, die in den Zeilen am untersten steht.

Ich denke, dass ich dann schon fast durch bin.
Danach werde ich herausfinden, wie ich die produzierten Daten ordentlich in das Design einbinden kann. Das aber später.
 
Wenn dch zb. das Aufnahmehaus nicht interessiert, dann kannst du es relativ flach halten
PHP:
            //Wenn ja, in den Resultaten-Array schreiben
            //Mit [] wird ein Array erstellt, respektive erweitert
            $selected[$termin][]= $userInfo['Pers.-Nr.'];

Das würde dann so aussehen
Code:
Array
(
	[01.06.2011] => Array
        (
            [0] => 1236
            [1] => 2345
            [2] => 3456
        )
    ...
)
 
Ok, da komm ich jetzt nicht mehr so ganz hinterher.

PHP:
    //Jeden Termin prüfen ...
    foreach($userTermin as $termin => $schicht){
        //... ob er mit $selectedSchicht beginnt 
        if(substr($schicht, 0, strlen($selectedSchicht)) == $selectedSchicht){
            //Wenn ja, in den Resultaten-Array schreiben
            $selected[$termin] = array(
                        'user'            => $userInfo['Nachname'],
                        'aufnahmehaus'    => $aufnahmehaus[$termin]
            );
 
        }

erweitere ich das in diesem Teil, dass anstatt eines Users, alle angezeigt werden, die 'Bo' Schichten haben?
 
Ok, da komm ich jetzt nicht mehr so ganz hinterher.

PHP:
    //Jeden Termin prüfen ...
    foreach($userTermin as $termin => $schicht){
        //... ob er mit $selectedSchicht beginnt 
        if(substr($schicht, 0, strlen($selectedSchicht)) == $selectedSchicht){
            //Wenn ja, in den Resultaten-Array schreiben
            $selected[$termin] = array(
                        'user'            => $userInfo['Nachname'],
                        'aufnahmehaus'    => $aufnahmehaus[$termin]
            );
 
        }

erweitere ich das in diesem Teil, dass anstatt eines Users, alle angezeigt werden, die 'Bo' Schichten haben?
Ersetzen, nicht erweitern
PHP:
            $selected[$termin] = array(
                        'user'            => $userInfo['Nachname'],
                        'aufnahmehaus'    => $aufnahmehaus[$termin]
            );
 
//Ersetzen durch
            $selected[$termin][]= $userInfo['Pers.-Nr.'];
 
Auch auf die Gefahr hin, dass ich deine Hilfsbereitschaft überstrapaziere, habe ich noch 2 Fragen, die ich alleine nicht gelöst bekommen werde.

1.) Ist es möglich, dass je nach aktuellem Datum, die 'Bo' Schichten ausgegeben werden? Angenommen, heute wäre der 01.06.2011, dass dann nur die angezeigt werden, die am jeweils aktuellen Tag mit 'Bo' Schichten eingeteilt sind. Bezogen auf die Beispieldatei, also diese Ausgabe:


Code:
    [01.06.2011] => Array
        (
            [0] => 1236
            [1] => 2345
            [2] => 3456
        )
    ...
)

Ich weiß, dass ich die Funktion Timestamp dazu mit irgendeiner if-Funktion verknüpfen muss.

2.) Wie kann ich es realisieren, dass die Umlaute korrekt ausgegegen werden. Habe versucht dazu die Funktion utf8_decode() zu nutzen, aber vermutlich falsch eingesetzt.
 
mit date() das heutige Datum in das gleiche Format bringen wie du es im txt-File hast. Mit diesem String als Schlüssel aus dem $selected-Array die Einträge auslesen
PHP:
$boToday = $selected[date('d.m.Y')]);

Umlaute? Ist immer ein geabstel - kommt halt drauf an in welchem Format sie in der Text-Datei vorliegen
 
Zuletzt bearbeitet:
Schön, habe ich hinbekommen.
Die Textdatei liegt so vor, wie ich sie hochgeladen habe.
Die wird von dem Schichtplanerprogramm erstellt.
 
Zurück