kostenloser Webspace werbefrei: lima-city


Kompliziertes Auslesen aus Textdatei?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.

    Hi,

    wie kann ich einen Text auslesen, der aus Abs?tzen besteht, und dabei ist jeder Abschnitt mit einem

    **********************************************************************

    getrennt?

    Also:

    **********************************************************************
    blabla

    bla
    **********************************************************************
    HI OO:Lapwlp,d
    wqeoinasd
    apn

    **********************************************************************


    Jetzt will ich einzeln (mit Abs?tzen!)
    "blabla

    bla"

    und

    "HI OO:Lapwlp,d
    wqeoinasd
    apn
    "


    Wie kann ich das machen?

    Danke,
    MfG lagerhaus
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 2 Variablen
    tmpText <-- da liest du sequenziell immer eine Textzeile ein
    tmpAusgabe <-- da packst du immer den Text rein, wenn es NICHT deiner Trennzeile entspricht

    In Visual Basic w?re was

    If tmtText<> "*************..." then
    tmpAusgabe = tmpAusgabe & vbcrlf & tmpText
    Else
    '/*jetzt mal C/C++ >:O)*/
    cout << tmpAusgabe
    End If

    Ich hoffe, das hilft dir wenigstens ein bi?chen!
  4. $text = readfile($dateiname);


    // 99 durch die Anzahl der Sterne ersetzen:
    $text_list = preg_split('/\n\*{99}\n/m', $text);

    Jetzt hast du ein Array, in dem jedes Element den Text eines Abschnitts enth?lt.
  5. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.



    alopex schrieb:
    $text = readfile($dateiname);


    // 99 durch die Anzahl der Sterne ersetzen:
    $text_list = preg_split('/\n\*{99}\n/m', $text);

    Jetzt hast du ein Array, in dem jedes Element den Text eines Abschnitts enth?lt.



    Leider gibt er mit readfile sofort den ganzen Text aus...

    Muss ich vorher irgendwie die Datei?ffnen?

    Ich hab die ***** jetzt durch +++++ ersetzt, sind einfacher zum Hantieren.

    Wie kann ich dann ein einzelnes Array-Element ausgeben?

    MfG lagerhaus
  6. Versuchs mal mit der Funktion "
    preg_match_all ()".
    Die kann man sehr gut daf?r verwenden.

    Z.B. :
    $tpl = '
    bla blub blub
    
    [block1]
    quak
    [/block1]
    
    m???p
    tr???t 
    etc.';
    preg_match_all ( '/(\[([\w]+)[^\]]*\])(.*)(\[\/\\2\])/', $tpl, $hits );
    
    print_r ( $hits );

    Du musst halt nur noch den regul?ren Ausdruck anpassen.
  7. Hm, es sieht f?r mich so aus als br?uchtest du gar keinen Array mit einzelnen Abs?tzen sondern nur etwas was das ganze umwandelt, dieses Skript ersetzt die ganzen Sternchen durch Doppelte Zeilenabst?nde:


    <?php
    $dateiname = "blub.txt";
    $suchen = "***";
    $ersetzen = "<br>\n<br>";

    $datei = file_get_contents($dateiname);
    $datei = str_replace($suchen, $ersetzen, $datei);
    ?>


    In $datei hast du nun statt den "***." lauter "<br><br>", also Abs?tze als HTML zum ausgeben.

    Beitrag ge?ndert am 29.09.2005 21:16 von redcow
  8. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.


    lucas9991 schrieb:
    Versuchs mal mit der Funktion '
    preg_match_all ()'.
    Die kann man sehr gut daf?r verwenden.

    Z.B. :
    $tpl = '
    bla blub blub
    
    [block1]
    quak
    [/block1]
    
    m???p
    tr???t 
    etc.';
    preg_match_all ( '/(\[([\w]+)[^\]]*\])(.*)(\[\/\\2\])/', $tpl, $hits );
    
    print_r ( $hits );

    Du musst halt nur noch den regul?ren Ausdruck anpassen.



    Kannst du das nochmal besser erkl?ren?
    Wo sind z.B. meine "+++++", und wo ist ein Array? Und wie muss ich den regul?ren Ausdruck anpassen???



    @redcow: Mir w?re ein Array lieber, als eine komplette Ausgabe...








    Allerdings w?rde ich gerne die Abs?tzte, die in dem Textdokument sind, auch ausgeben lassen, also:

    +++++
    Hallo

    Tsch?ss
    +++++
    lol
    tr???t

    m???p

    +++++

    Das soll dann zu zwei Elementen in einem Array werden, die jeweils so ausgegeben werden:

    "Hallo

    Tsch?ss"

    "lol
    tr???t

    m???p"


    Mit den Abs?tzen in den einzelnen Elementen...

    //EDIT: Wie ?ffne ich ?berhaupt das Textdokument? Da gibt es doch eine Menge von Befehlen... :confused:

    Beitrag ge?ndert am 29.09.2005 21:28 von lagerhaus
  9. Ok...
    Also ganz von vorne lieber lagerhaus. ;)
    Folgende Funktion gibt dir den Inhalt einer Datei zur?ck.
    function get_file ( $path ) {
      if ( file_exists ( $path ) ) {
        $template = '';
        if ( function_exists ( file_get_contents ( $path ) ) ) {
            $template = file_get_contents ( $path );
        } else {
          $handle = fopen ( $path , 'r' );
          while (!feof ( $handle ) ) {
            $template .= fgets ( $handle, 4096 );
          }
          fclose ( $handle );
        }
        return ( $template );
      } else {
        return ( 'Die Datei existiert nicht!' );
      }
    }
    
    /*
    Ein Aufruf erfolgt z.B. so :
    $file = get_file ( 'bla/blub.txt' );
    print ( $file );
    */



    Jetzt folgt der Code zum splitten der Datei in ein Array :
    $file = get_file ( 'pfad/zur/datei.txt.' );
    // Inhalt der Datei holen
    preg_match_all ( '/+{99}/', $file, $array );
    // 99 wieder durch die Anzahl der Sterne ersetzten und dann m?sste das Array "$array" gef?llt werden
    
    print_r ( $array );
    // Nachschauen, welche Werte jetzt im Array sind

    Das ganze solltest du mal ausf?hren, dann wirste bestimmt weiter kommen. ;)

    Beitrag ge?ndert am 30.09.2005 09:05 von lucas9991
  10. s******n

    hmmmm...lucas?

    Warum so kompliziert?
    Es gibt doch bereits eine PHP-eigene Funktion um eine Datei als Array einzulesen, und ich denke, die ist f?r Lagerhaus einfacher zu handhaben...
    <?
    $arrayname = file($Dateiname);
    $suchen = "***";
    $ersetzen = "<br>n<br>";
    $arrayname = str_replace($suchen, $ersetzen, $arrayname);
    
    foreach ($arrayname as $element) {
    echo $element;
    echo "<br>";
    }
    ?>

    danke ?brigens an redcow f?r den Stringmanipulationsbefehl :wink: war zu faul ihn aus meinem tut rauszukramen...

    So ein ?hnliches Script habe ich bis vor kurzem auf meiner HP eingesetzt um die Rubriken mit Text zu f?ttern...in den Dateien kann man dann n?mlich auch mit bbCode arbeiten...Wird in der n?chsten Zeit noch ein Tut zu entstehen.

    Gru?
    ssd

  11. alopex schrieb:
    $text = readfile($dateiname);

    // 99 durch die Anzahl der Sterne ersetzen:
    $text_list = preg_split('/\\n\*{99}\\n/m', $text);

    Jetzt hast du ein Array, in dem jedes Element den Text eines Abschnitts enth?lt.



    Leider gibt er mit readfile sofort den ganzen Text aus...

    Muss ich vorher irgendwie die Datei?ffnen?

    Ich hab die ***** jetzt durch +++++ ersetzt, sind einfacher zum Hantieren.

    Wie kann ich dann ein einzelnes Array-Element ausgeben?


    Stimmt, ich hatte ?bersehen, dass readfile() den String direkt in den Ausgabepuffer schreibt. Also musst du die Ausgabe abfangen:

    ob_start();
    readfile($dateiname);
    $text = ob_get_clean();

    $trennzeichen = '+';
    $no_tz = 99 + 0;

    // 99 durch die Anzahl der + ersetzen:
    $text_list = preg_split('/\\n'.preg_quote($trennzeichen).'{'.$no_tz.'}\\n/m', $text);


    An einzelne Abs?tze kommst du ran, indem du die Nummer des Absatzes (bei Null anfangen zu z?hlen) als Index angibst:

    $dritter_absatz = $text_list[2];

    Aber warum trennst du die Abs?tze ?berhaupt so wirr? PHP kann auch damit umgehen, wenn du z.B. zwei Zeilenumbr?che als Absatz-Trenner benutzt. Auch das kann man wunderbar mit preg_split() umsetzen. Schlie?lich macht MediaWiki auch nichts anderes -- kannst du dir ja mal in der Wikipedia ansehen: Man gibt Text getrennt durch mindestens zwei Zeilenumbr?che ein, und MediaWiki baut da draus HTML-Abs?tze ("p"-Tag).

    MfG
    alopex

    Beitrag ge?ndert am 30.09.2005 20:10 von alopex

    Beitrag ge?ndert am 30.09.2005 20:12 von alopex
  12. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.

    Vielleicht ist es Froscharbeit, aber:

    Wie w?re es denn mit 2 Abs?tzen? (Also die Wikipedia-Methode)?

    Au?erdem habe ich immer noch kein Array mit den einzelnen Abs?tzen. Liegts vielleicht an meinem Apache? (Ich teste es nicht auf Lima).

    Im Array[0] steht alles, in allen anderen nichts.

    Ich denke, ich m?sste das mit 2 Zeilenumbr?chen hinkriegen (die textdatei so zu ver?ndern). Wie k?nnte man dann ein funktionierendes Array erstellen?

    MfG lagerhaus
  13. Wenn im ersten Array-Eintrag alles steht, hat die Trennung nicht funktioniert. Kann am RegEx liegen. Ich habe ihn nicht explizit getestet. Au?erdem verhaut die Lima-Board-Software immer die Backslashes.

    Nur mit den Zeilenumbr?chen sollte es so gehen:

    ob_start();
    readfile($dateiname);
    $text = ob_get_clean();

    $text_list = preg_split('/\\n{2,}/m', $text);

    Das trennt die Zeilen immer nur dann, wenn mindestens 2 Zeilenumbr?che aufeinander folgen.

  14. Ich k?nnte dir ein programm programmieren, und dann zuschicken (auch als exe-datei). Aber f?r eine exe-datei m?sste ich es hochladen, oder du gibst mir deine email.
  15. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.

    <?php

    ob_start();
    readfile("dateiname.txt");
    $text = ob_get_clean();

    $text_list = preg_split('/\n{2,}/m', $text);


    $absatz = $text_list[1];

    echo $absatz;

    echo "Hallo Welt!";

    ?>


    :frown:

    Es geht nicht. In $absatz[0] steht wieder alles.
    @Alopex: Wie w?r's mit einem Screenshot, da kann das Board den Code nicht verf?lschen... Im momentanen Code habe ich nur einen Backslash.

    MfG lagerhaus

    //EDIT @jannis: .exe ist schlecht. Au?erdem will ich es sp?ter im Web haben -> da geht kein .exe

    Beitrag ge?ndert am 30.09.2005 21:07 von lagerhaus


    //EDIT2: Ja, man k?nnte das ersetzen. Wie z.B. aus * wurden + jetzt sind es 2 Abs?tze. Es geht trotzdem nicht :frown:

    Beitrag ge?ndert am 30.09.2005 21:13 von lagerhaus
  16. h******0

    Ich bin in dem Gebiet kein Experte, aber kann man die ----------- nicht durch Leertsten ersetzen
  17. Ich probiers mal so:

    http://alopex.pyrokar.lima-city.de/srccodelist/index.php?name=lagerhaus_regex

    Jetzt m?sste man den korrekten Quelltext sehen -- mit allen Slashes.

    @lagerhaus

    Das Problem liegt m?glicherweise in der Art der Zeilenumbr?che. Die h?ngt davon ab, mit welchem Programm die Text-Datei erzeugt wurde. Windows-Programme erzeugen normalerweise "\\r\\n", Unix und richtige Betriebssystem nehmen lieber "\\n" und unter MacOs ist "\\r" die Zeichenkombination der Wahl.

    @nachposter

    Mein sehr geehrter jacr! :wink:

    In einem Aspekt hast du tats?chlich Recht: Die Funktion fread() ist tats?chlich besser geeignet, um eine Datei in einen String einzulesen, als mein Konstrukt.

    Das Regul?re Ausdr?cke die CPU st?rker besch?ftigen als die gew?hnlichen Stringfunktionen ist ein weit verbreitetes Vorurteil, das durch nichts zu belegen ist, sich aber sicher ewig halten wird. Findet der RegEx einen passenden String, ist er genauso schnell wie eine gew?hnlich e String-Suche. Und wenn man eine unterschiedliche Zahl von Zeilenumbr?chen ohne preg_split() finden will, darf man umst?ndliche Konstrukte programmieren -- die definitiv mehr CPU-Arbeit erfordern.

    MfG
    alopex

    Beitrag ge?ndert am 30.09.2005 23:49 von alopex
  18. Dazu sage ich nur zwei Sachen:

    1. http://de.php.net/manual/de/function.fread.php

    $filename = "/usr/local/simi.txt";
    $handle = fopen ($filename, "r");
    $contents = fread ($handle, filesize ($filename));
    fclose ($handle);

    2. http://de.php.net/manual/de/function.split.php

    $text_list = split ( '----------------', $contents);


    Einfach mal das Fette beachten. ;)

    In ?brigen die preg_split-Funktion nur benutzen wenn man muss.
    Alopex m?chte so wie es aussieht, dass dein Rechner mehr zutun haben soll als n?tig ist. ;)

    Jens
  19. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.

    @Jacr:
    Zwar hab ichs eigentlich genau rauskopiert aus deinem Post, nat?rlich Filename und die Trennzeichen ver?ndert, aber nun hat er in keinem der Array-Teile mehr den Text.

    @Alopex: Geht leider wieder nicht. Alles im text_list[0] .


    MfG lagerhaus

  20. @Jacr:
    Zwar hab ichs eigentlich genau rauskopiert aus deinem Post, nat?rlich Filename und die Trennzeichen ver?ndert, aber nun hat er in keinem der Array-Teile mehr den Text.


    Oh, ich h?tte doch wohl genauer lesen sollen.
    Schau dir das unten mal an.
    Der * wird bei split als regul?rer Ausdruck interpretiert. Darum muss man f?r jeden * ein \* schreiben.

    http://jacr.milten.lima-city-webspace.de/test/mySplit.php
    http://jacr.milten.lima-city-webspace.de/test/mySplit.txt
    http://jacr.milten.lima-city-webspace.de/test/balbla.txt


    <?
    $filename = "balbla.txt";
    $handle = fopen ($filename, "r");
    $contents = fread ($handle, filesize ($filename));
    fclose ($handle);
    //echo $contents;
    $text_list = split ("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*", $contents);

    foreach ($text_list as $myTemp) {
    echo "Text:$myTemp";
    }
    ?>

    Edit
    Stimmt, alopex ich habe mich wirklich geirrt.
    Ich habe split mit explode verwechselt.

    Allerdings wird der Vorteil nicht sehr viel schneller sein. Denn wenn preg_split vern?mpftig programmiter wurde, muss nur der regul?re Ausdruck erkannt werden. Wenn er richtig erkannt wird ist das eigendliche Suchen nicht viel langsamer.
    Das erkennen des regul?ren Ausdruck braucht man aber bei explode nicht. Somit ist explode ein bisschen schneller.

    Mit beweissen das es schneller ist hat es nichts zutun. Wenn es richtig Programmiert wurde ist explode schneller.

    <?
    $filename = "balbla.txt";
    $handle = fopen ($filename, "r");
    $contents = fread ($handle, filesize ($filename));
    fclose ($handle);
    //echo $contents;
    //$text_list = split ("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*", $contents);
    $text_list = explode ('**********************************************************************', $contents);

    foreach ($text_list as $myTemp) {
    echo "Text:$myTemp";
    }
    ?>

    Beitrag ge?ndert am 1.10.2005 00:57 von jacr
  21. Autor dieses Themas

    lagerhaus

    Kostenloser Webspace von lagerhaus

    lagerhaus hat kostenlosen Webspace.

    Danke!

    Jacr hat es geschafft, mit deiner letzten Version.

    Vielen Dank f?r eure Hilfe! Problem gel?st.

    Hier nun das Ergebnis.

    http://lagerhaus.milten.lima-city.de/derweise/

    MfG lagerhaus
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!