Erste Schritte bei Problemstelllung - TXT File über Pattern Matching als HTML

besttuned

Cadet 2nd Year
Registriert
Mai 2010
Beiträge
31
Hallo Leute,

zuerst muss ich sagen, dass ich kein Neuling bin, was Programmierung angeht, aber ich wage mich etwas von meinem bevorzugten Gebiet (Python, C) in eine andere Umgebung (HTML, XML) und brauche dort einfach mal etwas Starthilfe.

Mein Problem ist folgendes:

Ich betreibe nebenbei als Hobby Paintball und meine bevorzugte Halle hat nun Schutzwesten mit intelligenten Protektoren probeweise eingekauft, diese verfügen über Sensoren, welche Treffer elektronisch aufzeichnen. Das ganze wird im System festgehalten und am Ende kann man sich eine TXT Datei anschauen, welche die Treffer festhält...

LEIDER gibt es keine Möglichkeit, die Treffer als Grafik oder andere visuelle Möglichkeit den Spielern zu zeigen, so dass meine Idee war, das TXT File zu parsen und die Ergebnisse als HTML Dokument auszugeben (vielleicht gibts noch bessere Möglichkeiten, ich bin für viele Voschläge offen). In der HTML Welt habe ich mich noch nicht so ausgetobt, natürlich könnte man auch in Python was in HTML machen, aber es gibt bestimmt "bessere" Lösungen.

Das TXT File könnte man per Pattern Matching schön auseinandernehmen, damit ihr euch es vorstellen könnt, habe ich das TXT File von einem Spiel angehängt

Code:
Hit other Team (by gun),1
Hit other Team (on gun),-1
Hit own Team (by gun),0
Hit own Team (on gun),0
Shots Fired,0

Plyr 01,Plyr 01,1,0
Plyr 02,Plyr 02,1,0
Plyr 03,Plyr 03,1,0
Plyr 04,Plyr 04,1,0
Plyr 05,Plyr 05,1,0
Plyr 06,Plyr 06,1,0
Plyr 07,Plyr 07,2,0
Plyr 08,Plyr 08,2,0
Plyr 09,Plyr 09,2,0
Plyr 10,Plyr 10,2,0
Plyr 11,Plyr 11,2,0
Plyr 12,Plyr 12,2,0


Plyr 12,5,3,Plyr 02,5,0,17:35:20
Plyr 09,5,3,Plyr 03,5,0,17:35:44
Plyr 07,5,3,Plyr 01,4,0,17:36:10
Plyr 12,5,3,Plyr 06,4,0,17:36:15
Plyr 05,5,15,Plyr 11,4,0,17:36:25
Plyr 05,5,15,Plyr 10,4,0,17:35:25

Am Anfang werden globale Parameter definiert, dann die Spieler zugeordnet in zwei Teams (zb Plyr 02,1 = Player 2 in Team 1) und danach folgt das Trefferprotokoll -> Erste Zeile Plyr 12 trifft Plyr 02 (die anderen Zahlen hängen mit den Sensoren zusammen, sind aber unwichtig, wo man getroffen wird ist hier egal)

Hat jemand ne Idee in was ich mich Einlesen kann? Vielen Dank im voraus
 
Das was du da hast ist im Grunde eine csv, damit solltest du einiges zur Verarbeitung, evtl. durch php, finden ;)
Ergänzung ()

Ach ja, Regex ist dein Freund :D
 
Sehen die Dateien immer gleich aus? Wenn ja braucht man kein Regex. Einfach am Zeilenende/Komma splitten und die Arrays verarbeiten.

/edit: Okay Regex ist doch ganz okay :D

Schau mal ob du damit etwas anfangen kannst.

PHP:
<?php

/**
* Erstellt ein Match-Objekt
*/
function loadMatch($matchData)
{
    // Nur die ersten 5 Zeilen nehmen
    $rows = explode("\n", $matchData);
    $rows = array_slice($rows, 0, 5);
    $rows = implode("\n", $rows);

    // Werte per Regex finden
    preg_match_all("/.*,([0-9\-]+)/", $rows, $stats, PREG_SET_ORDER);

    $match = new Match();
    $match->hitOtherTeamGun = $stats[0][1];
    $match->hitOtherTeam = $stats[1][1];
    $match->hitOwnTeamGun = $stats[2][1];
    $match->hitOwnTeam = $stats[3][1];
    $match->shotsFired = $stats[4][1];

    $match->teams = loadTeams($matchData);

    $match->hits = loadHits($matchData);

    return $match;
}

/**
* Spieler finden und pro Team in einem Array zusammenfassen
*/
function loadTeams($matchData)
{
    $teams = [];

    // Spieler per Regex finden
    preg_match_all("/Plyr ([0-9]+),Plyr ([0-9]+),([0-9]+),([0-9]+)/", $matchData, $matches, PREG_SET_ORDER);

    foreach ($matches as $match)
    {
        $teamNumber = $match[3];

        if(!isset($teams[$teamNumber])) {
            $teams[$teamNumber] = new Team($teamNumber);
        }

        $teams[$teamNumber]->addPlayer(new Player($match[1], $teamNumber, $match[4]));
    }

    return $teams;
}

/**
* Treffer finden
*/
function loadHits($matchData)
{
    $hits = [];

    // Treffer per Regex finden
    preg_match_all("/Plyr ([0-9]+),([0-9]+),([0-9]+),Plyr ([0-9]+),([0-9]+),([0-9]+),([0-9]+:[0-9]+:[0-9]+)/", $matchData, $matches, PREG_SET_ORDER);

    foreach ($matches as $match) {
        $hit = new Hit();
        $hit->sourcePlayer = $match[1];
        $hit->sourceSensorOne = $match[2];
        $hit->sourceSensorTwo = $match[3];
        $hit->targetPlayer = $match[4];
        $hit->targetSensorOne = $match[5];
        $hit->targetSensorTwo = $match[6];
        $hit->time = $match[7];
        $hits[] = $hit;
    }

    return $hits;
}


/**
* Stellt ein Match dar
*/
class Match
{
    public $hitOtherTeamGun = 0;
    public $hitOtherTeam = 0;
    public $hitOwnTeamGun = 0;
    public $hitOwnTeam = 0;
    public $shotsFired = 0;
    public $teams = [];
    public $hits = [];
}

/**
* Stellt einen Spieler dar
*/
class Player
{
    public $number;
    public $team;
    public $xxx;

    function __construct($number, $team, $xxx)
    {
        $this->number = $number;
        $this->team = $team;
        $this->xxx = $xxx;
    }
}

/**
* Stellt ein Team dar
*/
class Team
{
    public $number = 0;
    public $players = [];

    function __construct($number, $players = [])
    {
        $this->number = $number;
        $this->players = $players;
    }

    public function addPlayer($player)
    {
        $this->players[] = $player;
        return $this;
    }
}

/**
* Stellt einen Treffer dar
*/
class Hit
{
    public $sourcePlayer;
    public $sourceSensorOne;
    public $sourceSensorTwo;
    public $targetPlayer;
    public $targetSensorOne;
    public $targetSensorTwo;
    public $time;
}


$matchData = file_get_contents("paintball.txt");

$match = loadMatch($matchData);

echo "<pre>";
print_r($match);
echo "</pre>";
 
Zuletzt bearbeitet: (Code Beispiel hinzugefuegt)
Sag ich doch Regex :p

Ich kenne mich in diesem Unterforum nicht aus, habe das Thema nur zufällig auf der Startseite gesehen: Gibt man hier normalerweise Code als Antwort?
 
Kommt drauf an, wie interessant das Problem ist und wie viel Eigenleistung bzw. Lernwillen der jeweilige TE zeigt.
Meist gibt es nur ein paar Stichpunkte und das klassische "Rest beantwortet die gängige Standardliteratur"
 
Wow, r15ch13, also dein Beispiel ist schon ziemlich gut, auf jeden Fall zeigt es eindrucksvoll wie Regex arbeitet und gibt das Protokoll in einer schöneren Variante aus.

Bin jetzt gerade daran, dass jeder Spieler bei einem Treffer Punkte dazu bekommt, aber irgendwie will der Zugriff auf das Array nicht so richtig. Die Variable xxx habe ich in meinem Beispiel in points umbenannt, aber bekomm einen Fehler, wenn ich in das Array von Spieler 01 schreiben will.

Auch habe ich festgestellt, dass ich wenn es um die reine Trefferanzahl geht, auch einfach alle Einträge a la "Plyr xx,5,3," (Code Zeile 21) bei einem erfolgreichen Treffer bei jemanden und bei einem eigenen Hit nach String ",Plyr 02,5,0," mit dem einzigen Unterschied des angehenden Kommas, aber das Schreiben in einer Variablen und diese Abrufen gefällt mir besser, dann kann ich das Ergebnis der Spieler auch noch sortieren.
 
Zurück
Oben