php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.08.2007, 22:00  
Benutzer
 
Registriert seit: 23.08.2006
Beiträge: 86
Canni
Standard bestimmte Textblöcke aus einer Textdatei auslesen

Hallo.

Ich habe ( bzw. ) möchte eine Textdatei, in der Text thematisch in Blöcke zusammen gefasst ist, z.B.:

Code:
[thema1]
yhgfruztui
hsfuztp

[thema2]
thpbuez
oufztoeubo

usw.
Über ein Script möchte steuern welcher "Block" ausgegeben werden soll.
Wenn also Fall a eintritt soll der Textblock thema1 ausgegeben werden wenn der Fall b eintritt thema2.
Die Steuerung über case bzw. if/else ist ja kein Problem.
Das Auslesen der Datei eigentlich auch nicht ( fgets() oder file_get_contents() ). Nur:
Ich kann nur alles auslesen lassen. Gibt es eine Möglichkeit die Textdatei so zu schreiben, daß eine Block ein Anfang und ein Ende hat und nur das dann über das Script ausliest das anhand eines Start und Endparameters das Textfile "zerlegt"? Also quasi ( nur mal zur Veranschaulichung ):

PHP-Code:
if($_GET['thema'] == 'thema1'){
   
$text nl2br(file_get_contents('text.txt'));
   
/* wobei hier anstatt file_get_contents irgendwas stehn müßte das eben den Inhalt aus dem Textfile "filtert" */
}
elseif(
$_GET['thema'] == 'thema2'){
   
$text nl2br(file_get_contents('text.txt'));
   
/* wobei hier anstatt file_get_contents irgendwas stehn müßte das eben den Inhalt aus dem Textfile "filtert" */
}

echo 
$text
Oder muß ich das Ganze üblerweise mit regulären Ausdrücken machen?
Danke schon mal und Gruß

P.S.: Forumssuche und Mr. ( oder Mrs.? ) Google konnten mir nicht verwertbares mitteilen
Canni ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.08.2007, 23:11  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 243
mAy^daY
Standard

Also für sowas gibt es mehrere Möglichkeiten. Entweder du nimmst gleich ein richtiges Datenformat und packst deine Texte dort rein oder wenn du bei deiner Textdatei bleiben willst kannst du doch einfach ein Trennzeichen einführen. Nach diesem Trennzeichen suchst du und gibst alles dazwischen aus.

Also praktisch würde deine Datei so aussehen:
Code:
::Thema xyz
Inhalt zum Thema...
::Thema abc
Inhalt zum Thema...
Jetzt einfach schaun welche Zeile mit dem Trennzeichen anfängt (::Thema ) und dann schauen ob die Zeile das gewünschte Thema enthält. Danach einfach bis zum nächsten Trennzeichen oder EOF die Zeilen ausgeben.

Eine andere Möglichkeit ist das du gezielt diesen Block ausliest indem du am Anfang der Datei oder in einer separaten Datei praktisch ein Inhaltsverzeichnis hast in dem steht von welcher Zeile bis zu welcher Zeile der Inhalt des Themas zu finden ist. Dann kannst du genau diese Zeilen auslesen.

Aber wenn es hier wirklich um Texte geht, ist das bestimmt nicht die beste Lösung. Wie gesagt, denk einfach mal über ein anderes Datenformat nach.
mAy^daY ist offline  
Alt 09.08.2007, 23:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Nehmen wir doch einfach das omniöse andere Datenformat: XML
PHP-Code:
<?php
error_reporting
(E_ALL);

$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<text>
  <section name="PHP"><![CDATA[Hypertext Preprocessor]]></section>
  <section name="JSP"><![CDATA[Java Server Pages]]></section>
</text>
XML;
$xml  simplexml_load_string($string);
$txt  null;
$err  null;
$seek = @$_POST["seek"];
$any  = empty($seek);

try {
    if (!
property_exists($xml"section")) {
        throw new 
Exception("the data source does not contain any text section");
    }
    foreach (
$xml->section as $section) {
        
$attr $section->attributes();
        if ((
property_exists($attr"name") && $attr->name == $seek) || $any) {
            
$txt $section[0];
            break;
        }
    }
    if (empty(
$txt)) {
        
$err "the data source does not contain a section with the given name";
    }
} catch (
Exception $e) {
    
$err $e->getMessage();
}
echo 
'<?xml version="1.0" encoding="UTF-8"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title></title>
    
    <style type="text/css">
        body {
            background-color : silver;
        }
        div, h1 {
            font-family : sans, Verdana;
            font-size   : 11px;
        }
        div.err {
            color : red;
        }
        div.txt {
            color : black;
        }
    </style>
</head>
<body>

<form action="<?=$_SERVER['PHP_SELF']?>" method="post">
    <input name="seek" type="text" value="<?=@$_POST["seek"]?>" />
    <input type="submit" value="seek section" />
    <hr noshade="noshade" size="1" />
    <? if (!empty($err)) { ?><div class="err"><h1>Error</h1><?=$err?></div><? ?>
    <? if (!empty($txt)) { ?><div class="txt"><h1>Text found</h1><?=$txt?></div><? ?>
    
</form>

</body>
</html>
Probier mal "PHP", "JSP" und ".NET"
Zergling-new ist offline  
Alt 09.08.2007, 23:28  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 243
mAy^daY
Standard

Zitat:
Zitat von Zergling
Nehmen wir doch einfach das omniöse andere Datenformat: XML
So offensichtlich wollte ich es nicht sagen
Da wären mir noch INI, CSV oder gleich eine Datenbank in den Sinn gekommen.
mAy^daY ist offline  
Alt 09.08.2007, 23:39  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

XML ist ja haargenau das Textformat das er sucht. Als Webentwickler kommt man so oder so nicht an XML vorbei, je früher mans lernt desto besser. INI und CSV finde ich unpraktikabel.

Datenbank wär letztlich aber natürlich wohl das beste.
Zergling-new ist offline  
Alt 10.08.2007, 10:31  
Benutzer
 
Registriert seit: 23.08.2006
Beiträge: 86
Canni
Standard

Hallo.
Danke für Antworten. Haben doch meine "Fantasie" etwas beflügelt, sodaß ich mich jetzt nur noch für die Richtung entscheiden muß.

Zitat:
XML ist ja haargenau das Textformat das er sucht. Als Webentwickler kommt man so oder so nicht an XML vorbei, je früher mans lernt desto besser. INI und CSV finde ich unpraktikabel.

Datenbank wär letztlich aber natürlich wohl das beste.
Nein, das was nicht genau das was ich suchte. Ich gebe zu, daß mich XML irgendwie abschreckt ( deshalb das Nein, aber langsfristig habt ihr natürlich Recht ). Das Textdateiformat habe ich deshalb ausgewählt, weil ich längere Texte in Blöcke Gliedern möchte und natürlich auch die Pflege der Textdatei nicht zu umständlich sein sollte.

Ich denke ich werde aber dann doch die DB-Variante nehmen ( wollte eben mal was Neues ausprobieren ). Ist wahrscheinlich auch performanter als ne Textdatei zu parsen.
Zerglings XML-Vorschlag nehme ich mir aber trotzdem mal zum "Einlernen" vor, genauso wie ::Thema xyz. Früher oder später kriegt man so eine Anforderung vor den Latz geknallt, stammelt rum und braucht Ewigkeiten um es umzusetzten. Will ja auch weiterkommen ...
Canni ist offline  
Alt 10.08.2007, 11:40  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Vom Code her wird die DB-Variante auch nicht einfacher.
SimpleXML-Objekte kennen übrigens die Methode asXml(). Das heißt du kannst das $xml Objekt auch schreiben, die Methode ausführen, den Rückgabewert mit file_put_contents() zurück in die Datei schreiben, und hast jetzt sogar schreibend Zugriff auf die Elemente.

Und das mit 70 Zeilen Code, wovon mehr als die Hälfte HTML und vom PHP Code mehr als die Hälfte zum Fehlerabfangen da ist. Bleiben knapp über 10 Zeilen, das XML zu lesen und zu schreiben. Ich weiß garnicht was dich hier abschreckt

http://de.php.net/simplexml

Mal vereinfachter Code ohne Fehlerbehandlung, vielleicht bring ich dich ja doch zu XML

test3.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<text></text>
test3.php
PHP-Code:
<?php
$file 
"test3.xml";
$xml  simplexml_load_file($file);
// schreibzugriff wenn angefordert und ein section-name angegeben wurde
if (@$_POST["access"] == "write" && strlen(@$_POST["name"]) > 0) {
    
// section erstellen und wert zuweisen
    
$section $xml->addChild("section", @$_POST["value"]);
    
// attribut name festlegen, wir wollen den tag ja später wiedererkennen
    
$section->addAttribute("name"$_POST["name"]);
    
// xml in die datei schreiben
    
file_put_contents($file$xml->asXml());
    
// damit wir es auch gleich wieder auslesen können, ob es geklappt
    // hat, die datei gleich nach dem schreiben wieder laden
    
$xml simplexml_load_file($file);    
}
// lesezugriff auf alle section's'
for ($i 0$i count($xml->section); ++$i) {
    
// attribute auslesen
    
$attr $xml->section[$i]->attributes();
    
// ist der name der gesuchte?
    
if ($attr->name == @$_POST["name"]) {
        
// löschen dieses elements angefordert?
        
if (@$_POST["access"] == "delete") {
            
// element löschen
            
unset($xml->section[$i]);
            
// und neue struktur speichern
            
file_put_contents($file$xml->asXml());
        } else {
            
// nicht löschen? dann wohl nur lesen
            
$value $xml->section[$i][0];
        }
        
// aus der schleife aussteigen
        
break;
    }
}
?>
<html><head><title></title></head><body>
<form action="" method="post">
    Section <input name="name" type="text" value="<?=@$_POST["name"]?>" />
    <input checked name="access" type="radio" value="read" /> lesen
    <input name="access" type="radio" value="write" /> schreiben
    <input name="access" type="radio" value="delete" /> löschen
    <input type="submit" />
    <textarea name="value"><?=@$value?></textarea>
</form>
</body></html>
35 Zeilen PHP-Code für Lese-, Schreib- und damit auch Löschzugriff, und davon sind die Hälfte Kommentare Egal nehm ich vielleicht sonst mal als Tutorial-Ansatz für SimpleXML.
Zergling-new ist offline  
Alt 10.08.2007, 17:12  
Benutzer
 
Registriert seit: 23.08.2006
Beiträge: 86
Canni
Standard

Klasse Danke.
Das geh ich mal durch. Geht allerdings nur Zuhause. Im Office hab ich nur PHP4. Ich hatte schon öfter mal an XML gedacht, aber unter PHP4 den Kram zu parsen war mir doch etwas zu heftig, bzw. der Aufwand zu groß.
Jetzt muß ich´s mal durchziehen .

Ich habe aber das Problem mit meiner Textdatei gelöst:

Die Textdatei ( text.txt):

Code:
::Block1
Erster Block.
Hier gibt es Nichts zu lesen.
::eob

::Block2
Zweiter Block.
Hier kommt schon etwas mehr.
Zum Beispiel eine neue Zeile.
::eob

::Block3
Dritter Block.
Hier wird ganz heftig.
VIER Zeilen!!!
Aber Hallo.
::eob
Und dazu die php. Der Funktion werden Name(und Pfad), Blockname und Blockendezeichen übergeben...:

PHP-Code:
<?php



function read_file($file$start$ende){
    
    if(
file_exists($file)){
        
$file fopen($file'r');
            
#var_dump($file); echo "
";
    }
        else{
            $error = 'Datei nicht gefunden.';
            return $error;
        }
        
    while($text = fgets($file)){
        if(preg_match($start, $text)){
            while($text = fgets($file)){    
                if(preg_match($ende, $text)){
                    return;
                }
                echo $text; echo "
";                        
            }
        }    
    }
    
} // end function



$block = 'Block2'; 
/*in $block steht dann case sensitive der Name des Blocks der angezeigt werden soll. Also, wenn Fall a eintritt $block = 'a' wenn nicht dann $block = 'b'...
*/
$file = 'test.txt'; // Filename
$start = '/::'.$block.'/'; // Blockname    
$ende = '/::eob/'; // Blockende

read_file($file, $start, $ende);

?>
Also, das funktioniert ziemlich gut. Ist halt nur zum Auslesen...
Thx nochmal und Gruß
Canni ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
kann textdatei nicht auslesen Eardy PHP Tipps 2008 1 28.02.2008 16:23
Textdatei auslesen, aber ohne Komentare HSFighter PHP Tipps 2006 31 23.02.2006 10:07
[Erledigt] bestimmte ID's auslesen als array PHP Tipps 2007 2 31.10.2005 20:23
Abbruch beim Auslesen einer Textdatei workaholic PHP Tipps 2005-2 4 24.10.2005 18:55
beim auslesen von mysql datenbank bestimmte id nicht auslsen djrace PHP Tipps 2005-2 3 10.09.2005 13:32
Bestimmte Werte aus cvs Datei auslesen PHP Tipps 2005-2 1 20.06.2005 13:11
Nur bestimmte daten aus einer tabelle auslesen. Datenbanken 15 28.02.2005 12:49
Textdatei mit unregelm. Werten in versch. Größen auslesen? PHP Tipps 2005 6 14.01.2005 09:38
[Erledigt] .reg Datei auslesen und bestimmte Zeile ändern PHP-Fortgeschrittene 19 27.10.2004 10:39
Nur bestimmte Felder auslesen (forum_id) Datenbanken 10 22.10.2004 09:19
[Erledigt] Werte aus Textdatei auslesen PHP Tipps 2004 22 19.10.2004 15:00
[Erledigt] Nur bestimmte Daten auslesen und in Datenbank schreiben PHP Tipps 2004 2 26.09.2004 14:33
Textdatei auslesen me PHP Tipps 2004 19 26.08.2004 12:59
Laufschrift (auslesen über Textdatei) PHP Tipps 2004 6 22.08.2004 19:58
Textdatei auslesen und Dateien downloaden PHP Tipps 2004 1 15.08.2004 13:05

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/php-tipps-2007/44552-bestimmte-textbloecke-aus-einer-textdatei-auslesen.html, java txt einlesen, php bestimmte zeile auslesen, programm zerlegen von textfiles, php text auslesen bestimmter teil, java textdatei parsen, access zeilen auslesen txt, php textdatei parsen, textdatei blockweise auslesen php, php datei in blöcken einlesen, php textdatei bestimmter text auslesen, textblock mit gesuchten text speichern, php parse textfile sections, xml attribute auslesen java, access textdatei einlesen, file_get_contents() bestimmte zeile lesen, acess textdateien bestimmte zeilen löschen, php textdatei auslesen bestimmter daten, count \bestimmter text\ php datei, xml string auslesen php

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.