Textdatei benötigte zeilen weiterverarbeiten

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Benjamin Rauer

Mitglied
Hallo Ihr lieben,

ich möchte eine Textdatei mit folgendem Inhalt (für ein Quizspiel) auslesen und nur den benötigten Teil in der Datenbank abspeichern.

Textdatei:
Code:
[26]
FZ1=
FZ2=Vulkanite entstehen durch ?
FZ3=
Min=4000
Max=125000
Antwort_1=1 schnelle Abkühlung von Lava
Antwort_2=0 Abkühlung von Magma
Antwort_3=0 Umwandlung von Plutoniten
Antwort_4=0 Bildung eines Plutonits

[27]
FZ1=
FZ2=Welches Merkmal weisen Plutonite
FZ3=nicht auf?
Min=2000
Max=64000
Antwort_1=0 gut ausgebildete Kristalle
Antwort_2=0 ein körniges Gefüge
Antwort_3=1 Einsprenglinge in einer Grundmasse
Antwort_4=0 eine porphyrische Struktur

Die erste Zeile ist die ID, die nicht benötigt wird.
Die Frage ist in drei Zeilen FZ1= FZ2= FZ3= aufgeteil, die wiederum zu einer Zeile zusammen gefügt werden muss.
Bei der Antwort ist die Lösung nach dem = mit einer 1 markiert, welche seperat als lösung in der DB gespeichert wird. Z.b. if Lösung 1=1 (DB richtig = a) 2=1 (DB richtig = b) usw.

Meine DB sollte dann so gefüllt aussehen:
FrageVulkanite entstehen durch ?
aschnelle Abkühlung von Lava
bAbkühlung von Magma
cUmwandlung von Plutoniten
dBildung eines Plutonits
richtiga


MIN und MAX wird auch nicht benötigt.

Ich hoffe ihr könnt mir hierbei helfen!
 

Sempervivum

Erfahrenes Mitglied
Wenn Du das Ganze in einer Datenbank eintragen willst, hast Du ja sicher Grundkenntnisse in PHP. Und wenn die Datei genau nach diesem Muster aufgebaut ist, kann man sie relativ einfach auswerten. Schau, ob dir dies weiter hilft:
Code:
$qa = file('quiz.txt', FILE_IGNORE_NEW_LINES);
for ($i = 0; $i < count($qa); $i++) {
    var_dump($i);
    // pruefen, ob die aktuelle Zeile die ID enthaelt
    if (preg_match("/\[\d+\]/", $qa[$i]) == 1) {
        $question = '';
        $i++;
        $question .= substr($qa[$i], 4);
        $i++;
        $question .= substr($qa[$i], 4);
        $i++;
        $question .= substr($qa[$i], 4);
        var_dump($question);
        $i += 3;
        // jetzt zeigt $i auf die erste Antwort und Du kannst
        // die Antworten auswerten
    }
}
 
Zuletzt bearbeitet:

Benjamin Rauer

Mitglied
Wenn Du das Ganze in einer Datenbank eintragen willst, hast Du ja sicher Grundkenntnisse in PHP. Und wenn die Datei genau nach diesem Muster aufgebaut ist, kann man sie relativ einfach auswerten. Schau, ob dir dies weiter hilft:
Code:
$qa = file('quiz.txt', FILE_IGNORE_NEW_LINES);
for ($i = 0; $i < count($qa); $i++) {
    var_dump($i);
    // pruefen, ob die aktuelle Zeile die ID enthaelt
    if (preg_match("/\[\d+\]/", $qa[$i]) == 1) {
        $question = '';
        $i++;
        $question .= substr($qa[$i], 4);
        $i++;
        $question .= substr($qa[$i], 4);
        $i++;
        $question .= substr($qa[$i], 4);
        var_dump($question);
        $i += 3;
        // jetzt zeigt $i auf die erste Antwort und Du kannst
        // die Antworten auswerten
    }
}

Guten Morgen, danke für deine Antwort @Sempervivum
Ich steh immernoch auf dem Schlauch, das einzige was ich angezeigt bekomme ist die Frage, die doch mit substr($qa[$i], 4) zusammen gefügt wurde.
Frage$question

alle anderen DB felder sind noch leer.
 

Sempervivum

Erfahrenes Mitglied
Ja, das sollte auch nur eine Hilfe zum Einstieg sein und ich dachte, Du könntest die Antworten dann selbst hinzu fügen. Wenn du es nicht hinbekommst, erweitere ich es später.
 

Sempervivum

Erfahrenes Mitglied
Ich habe die Antworten ergänzt, versuche, ob Du damit weiter kommst. Und beachte, dass dieses Skript nur funktioniert, wenn dass Format genau eingehalten wird. Will man auch Fehler und Variationen abfangen, wird es um einiges komplizierter.
Code:
$correctArr = ['a', 'b', 'c', 'd'];
$qa = file('quiz.txt', FILE_IGNORE_NEW_LINES);
for ($i = 0; $i < count($qa); $i++) {
    // pruefen, ob die aktuelle Zeile die ID enthaelt
    if (preg_match("/\[\d+\]/", $qa[$i]) == 1) {
        $question = '';
        for ($j = 0; $j < 3; $j++) {
            $i++;
            $question .= substr($qa[$i], 4);
        }
        var_dump($question);
        $i += 3;
        // jetzt zeigt $i auf die erste Antwort und Du kannst
        // die Antworten auswerten
        for ($j = 0;
            //Antwort_1=0 gut ausgebildete Kristalle
            $j < 4, preg_match("/^Antwort_\d=(\d) (.*)$/", $qa[$i], $matches) === 1;
            $i++, $j++) {
            if ($matches[1] == '1') {
                $correct = $correctArr[$j];
            }
            $answer = $matches[2];
            var_dump($answer);
        }
        var_dump($correct);
    }
}
 
Zuletzt bearbeitet:

Benjamin Rauer

Mitglied
Ich habe die Antworten ergänzt, versuche, ob Du damit weiter kommst. Und beachte, dass dieses Skript nur funktioniert, wenn dass Format genau eingehalten wird. Will man auch Fehler und Variationen abfangen, wird es um einiges komplizierter.
Code:
$correctArr = ['a', 'b', 'c', 'd'];
$qa = file('quiz.txt', FILE_IGNORE_NEW_LINES);
for ($i = 0; $i < count($qa); $i++) {
    // pruefen, ob die aktuelle Zeile die ID enthaelt
    if (preg_match("/\[\d+\]/", $qa[$i]) == 1) {
        $question = '';
        for ($j = 0; $j < 3; $j++) {
            $i++;
            $question .= substr($qa[$i], 4);
        }
        var_dump($question);
        $i += 3;
        // jetzt zeigt $i auf die erste Antwort und Du kannst
        // die Antworten auswerten
        for ($j = 0;
            //Antwort_1=0 gut ausgebildete Kristalle
            $j < 4, preg_match("/^Antwort_\d=(\d) (.*)$/", $qa[$i], $matches) === 1;
            $i++, $j++) {
            if ($matches[1] == '1') {
                $correct = $correctArr[$j];
            }
            $answer = $matches[2];
            var_dump($answer);
        }
        var_dump($correct);
    }
}
Danke!
Das sieht im Dump perfekt aus. kannst du bitte noch die antworten einzeln deklarieren, denn wenn ich im unteren teil der schleife alle mit echo aufrufe, bekomme ich nur die letzte antwort ausgegeben.


Code:
}
        var_dump($correct);
    }

   echo $question;
   echo $answer;
   echo $correct;

}

So ungefähr

Code:
}
        var_dump($correct);
    }

   echo $question;
   echo $answer1;
echo $answer2;
echo $answer3;
echo $answer4;
   echo $correct;

}
 

Sempervivum

Erfahrenes Mitglied
Bitte sehr:
Code:
$correctArr = ['a', 'b', 'c', 'd'];
$qa = file('quiz.txt', FILE_IGNORE_NEW_LINES);
for ($i = 0; $i < count($qa); $i++) {
    // pruefen, ob die aktuelle Zeile die ID enthaelt
    if (preg_match("/\[\d+\]/", $qa[$i]) == 1) {
        $question = '';
        for ($j = 0; $j < 3; $j++) {
            $i++;
            $question .= substr($qa[$i], 4);
        }
        var_dump($question);
        $i += 3;
        // jetzt zeigt $i auf die erste Antwort und Du kannst
        // die Antworten auswerten
        $answers = [];
        for ($j = 0;
            //Antwort_1=0 gut ausgebildete Kristalle
            $j < 4, preg_match("/^Antwort_\d=(\d) (.*)$/", $qa[$i], $matches) === 1;
            $i++, $j++) {
            if ($matches[1] == '1') {
                $correct = $correctArr[$j];
            }
            $answer = $matches[2];
            $answers[$correctArr[$j]] = $answer;
        }
        var_dump($answers);
        echo 'Antwort a: ' . $answers['a'];
        // usw.
        var_dump($correct);
    }
}
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge