Textblöcke in Dateien automatisch kürzen

  • Als ziemlicher Programmier-Laie bitte ich euch um Hilfe.
    Ich bin blutiger Auto-It Anfänger (habe zuletzt vor vielen Jahren mit QBasic herumgebastelt, aber fast alles vergessen...), und möchte mich nun wieder einarbeiten.

    Ich möchte Auto-It dazu verwenden (zumindest erscheint es mir dafür am geeignetsten), eine größere Anzahl hmtl-Dateien zu bearbeiten, konkret: Lange Textpassagen darin zu kürzen. Also sozusagen den eigentlichen Quellcode unverändert lassen, aus den Texten aber "Teaser" zu machen.
    In der Boardsuche habe ich leider nichts Passendes gefunden (da werden allenfalls die Suchergebnisse verändert, nicht etwas zwischen zwei Suchstellen).
    Diese Textpassagen, von denen es pro Datei durchaus 100 oder mehr geben kann, stehen in zwei Rubriken, die über Suchbegriffe eindeutig erkannt werden können. Auch Beginn und Ende der Textpassagen können über eindeutige Zeichenketten erkannt werden, nur die Texte selbst sind natürlich stets andere.
    Ich stelle mir das so vor:

    1 Öffne erste Datei im Verzeichnis "Original"

    2 Suche darin ersten Rubrik (Beginn erkennbar durch Text "aaaaaaa")

    3 Suche darin nach Textstelle zwischen zwei Suchkriterien (z.B. Link-Ende und nächstem festen Umbruch)
    (_StringBetween? Wenn ich das richtig verstehe, schreibt _StringBetween einen Array mit allen Fundstellen, dann kann man vielleicht 4 + 5 direkt auf den Array anwenden und die Schleife mit der Suche in der Datei sparen?)

    4 Kürze die Textstelle auf die 200 ersten Zeichen, füge "(...)" hinzu, ersetzte Originaltextstelle damit (StringReplace?)

    5 Solange nicht Ende der Rubrik mit "bbbbbbb" erreicht, suche weiter in der Datei. d.h. wiederhole ab 3

    6 Suche zweite Rubrik (Beginn erkennbar durch Text "ccccccc")

    (analog weiter wie 3 bis 5, bis "ddddddd")

    7 Speichere veränderte Datei im Verzeichnis "Kopie"

    8 Wiederhole 1 bis 7 für alle Dateien im Verzeichnis "Original"

    Ich glaube ja, dass das nur einige wenige Code-Zeilen sind, aber ich kann nirgends eine Vorlage finden, die ich passend abändern kann. Und selbst den Code zu schreiben traue ich mir noch nicht zu (habs kürzlich mal versucht und bin mit Fehlermeldungen überschüttet worden, ohne dass ich verstanden habe, wo das Problem lag ;) )
    Die "aaaaaa" usw. kann ich dann durch die tatsächlichen Suchkriterien ersetzen.
    Wahrscheinlich wäre es am einfachsten, die ganze Datei als einen einzigen langen String zu laden und zu manipulieren? Allerdings haben die Dateien Größen bis zu 500 kb; ich weiß nicht einmal, ob so lange Strings überhaupt möglich oder manipulierbar sind.

    Als Beispiel für die Dateien könnt ihr eine beliebige Google-News-Seite nehmen (nein, ich will nicht Google-News verarbeiten, die Texte dort sind ja auch schon gekürzt, aber die Struktur ist recht ähnlich. Die Dateien, die ich bearbeiten möchte, stammen nicht aus fremder Quelle!). Unten ein GN-Textauszug, im Original sind Links und andere Formatierungen drin, die auch hier die eindeutige Erkennung der Textbereiche ermöglichen, in diesem Plain-Text-Beispiel wäre es zwischen "Minuten gefunden" und "...":

    ------------------
    Knut und Co.: Wieviel Eisbär ist erlaubt?
    Philibuster - vor 8 Minuten gefunden
    Eisbär Knut ist gestorben und konkurriert nun mit Japan und Libyen um die Top-Schlagzeilen. Schlimm ist das eigentlich nicht, sondern eher Anlass, ...

    Gedenken: Porzellanfiguren von Knut zu gewinnen
    Berliner Morgenpost - vor 1 Stunde gefunden
    Schon kurz nach seiner Geburt wurde Knut zum Berliner Wahrzeichen. Dies nahm auch die Königliche Porzellan-Manufaktur in Berlin zum Anlass, Knut eine ...

    Rätselraten in Berlin: Woran starb Knut?
    STERN.DE - vor 20 Stunden gefunden
    Pathologen untersuchen nun den Tod des Eisbären Knut. Doch bis zum Montagabend blieben die Untersuchungen ohne konkretes Ergebnis. ...

    ----------------

    Es wäre großartig, wenn mir dabei jemand helfen könnte.
    Freue mich darauf, mit Hilfe dieses ersten kleinen Skripts Auto-It zu erlernen und das Skipt dann noch weiter auszubauen.

    Vielen Dank!

    Einmal editiert, zuletzt von Moosfrosch (7. April 2011 um 10:18)

  • Geht genau so wie du es beschrieben hast.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • hallo!!

    ...ich hab grad nicht viel zeit, also fasse ich mich kurz:

    lange strings sind kein problem. um von der Datei zu einem string zu kommen:

    [autoit]

    $dateiname="meinehtmldatei.html"
    $derstring=FileRead($dateiname)

    [/autoit]

    dann: Wissen aneignen!! :D
    ->

    um alle dateien in einem ordner zu öffnen braucht man fortgeschrittenere Funktionen wie

    [autoit]

    FileFindFirstFile()
    und
    FileFindNextFile()

    [/autoit]


    wenn du die funktionen hier anklickst, kommst du gleich zur Hilfe und kannst dich darüber informieren. In der Hilfe findet man auch immer Beispielskripte zu den Funktionen, also eine gute Basis zum Arbeiten.
    Ich würde dir aber vorschlagen, zunächst das eigentliche Problem zu bearbeiten, Datei-Rekursionen kannst du später immernoch hinzufügen, wenn du mit der Materie etwas vertrauter geworden bist...

    Hast du schon mal was von RegEx gehört? Ein kraftvolles mittel, mitdem man schnell und effizient stringoperationen wie ersetzen durchführen kann. Schau mal bei Wikipedia oder in der Hilfe bei

    [autoit]

    StringRegExpReplace()

    [/autoit]


    Achtung! am Anfang etwas kompliziert ;)

    Ich kann dir noch ein wenig helfen, aber les dich erst mal ein wenig ein ;)

    Grüße,
    r4lf


    Edit: ...kannst du so eine HTML-Datei hochladen?

  • Vielen Dank erstmal allen Antwortern!
    Ich schaue mir dann die Funktionen mal genauer an und versuche sie zu verstehen.
    RegEx sagt mir (noch) nichts, aber das kann man ja ändern...
    Bin für alle weiteren Ideen und Hinweise dankbar und hoffe auf weitere Hilfe, wenn ich nicht weiterkomme.

  • @r4lf,
    danke für die hilfreichen Tipps. Das mit dem Datei-öffnen klappt schon mal...

    Hast du schon mal was von RegEx gehört? Ein kraftvolles mittel, mitdem man schnell und effizient stringoperationen wie ersetzen durchführen kann.

    Habe mir das angeschaut, ein wirklich machtvolles (und komliziertes) Werkzeug. Ich denke aber, ich benötige es gar nicht, weil meine Suchbegriffe ja feststehende Zeichenketten sind und das, was gekürzt werden soll, ein beliebiger String zwischen den zwei Suchbegriffen ist. Das müßte eigentlich auch nur mit _StringBetween, StringLeft und StringReplace funktionieren - ?. Weiß nur noch nicht so recht, wie. Ich glaube, ich verirre mich gerade bei der Verschachtelung...
    Eine Originaldatei kann ich leider nicht zur Verfügung stellen, da dort persönliche Daten drin stehen. Ich kann aber gern einen Dummy bauen, wenn das hilft.

    • Offizieller Beitrag

    Die Richtigen Befehle hast du schon, probier es doch einfach mal aus. Wenn du nicht mehr weiterkommst, kannst du immer noch nachfragen.
    Dummydaten sind auch immer von Vorteil, sonst muß man so viel raten. ;)

  • ...also cih hab jetzt auf basis deines posts ein skript geschrieben, das das macht was du willst...
    ich bin mir nur nich tsicher, ob ich das jetzt schon hier posten soll, oder ob ich dich noch ein wenig selber suchen lassen soll ;)

    ...vielleicht ein kleiner tip:
    ich hab noch nie _stringBetween benutzt, aber StringRegExp gibt einen Array zurück! dann kannst du einfach auf alle elemente deine Kürzungsfunktion anwenden.
    Die Regexp die ich benutzt habe:

    [autoit]

    ;REGULAR EXPRESSION:
    $results=StringRegExp($text,"(?s)(?<=\Q".$start."\E).*?(?=\Q".$end."\E)",3)
    #cs regexp-erklärung: | |________________| | |_____________| |
    | | | | |
    | | | | gibt einein Array zurück
    | | | Das steht dahinter
    | | .*? = finde die wenigsten Zeichen dazwischen
    | das steht vor dem ergebnis
    findet Zeilenumbrüche
    dabei stellen \Q und \E sicher, dass sonderzeichen im startstring und im endstring (zB , * ? \ etc)
    nicht als regexp interpretiert werden, sondern als STRING
    #ce

    [/autoit]

    ...alles klar? ;)

    Edit: ...dabei sind $start und $end jeweils die vordere und hintere begrenzung.... ;)

  • ich hab noch nie _stringBetween benutzt, aber StringRegExp gibt einen Array zurück!


    _StringBetween auch, StringRegExp ist aber wenn es mal erstell ist deutlich schneller dafür ist aber _StringBetween leichter zu verstehen und daher das Skript schneller erstellt.

    nicht jeder versteht Quantenphysik:

    Zitat

    RegEx ist wie Quantenphysik - Niemand versteht es zu 100%, aber alle wissen dass es irgendwie funktioniert!

    mfg autoBert

  • aaah, bei der Quantenphysik sind wir in meinem Gebiet ;)
    hübsches Zitat!...ist wahrscheinlich wirklich so....

    Grüße,
    r4lf


  • ich hab noch nie _stringBetween benutzt, aber StringRegExp gibt einen Array zurück! dann kannst du einfach auf alle elemente deine Kürzungsfunktion anwenden.

    _stringBetween nutzt RegExp

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ah, äh, Quantenphysik...
    Also ohne die Erklärung hätte ich die RegEx-Formel überhaupt nicht verstanden, und mit verstehe ich grob, was sie macht, aber selbst sowas zu schreiben - keine Chance.
    @r4lf, wozu ist die Suche nach Zeilenumbrüchen gut? Oder ist das nur ein Gimmik "für alle Fälle", damit die Formel universell verwendbar ist?
    Habe gestern noch versucht, die verschiedenen Bauteile zu kombinieren, mich aber verfranzt.
    Hätte nicht gedacht, daß ich so aus dem Programmieren raus bin...
    @r4lf, wenn Du das Problem schon gelöst hast, dann kann ich mir die Dummy-Datei sparen, oder? Verstehe aber, daß Du es nicht posten willst (auch wenn's mir viel Zeit sparen würde...), aber ich will Auto-It ja selbst lernen (oder zumindest verstehen, was es macht.
    Werde mich jetzt am Wochenende wohl doch mal intensiver damit beschäftigen müssen.

    Vielen Dank an alle, die bisher geantwortet haben, tolles Forum!

  • Zeilenumbrüche:
    Ich weiß nicht genau wie deine HTML Datei aufgebaut ist, aber normalerweise ist eine HTML-Datei mit Zeilenumbrüchen eingeteilt und gegliedert. Wenn das bei dir nicht der Fall ist, kannst du den modifier ja raus machen, würd ihn aber drin lassen, gut sich dran zu gewöhnen, den braucht man fast immer ;)

    Code posten:
    ...ich hab den ja für irgendeinen Zweck gemacht, und zwar damit er dir weiterhilft ;)
    wenn du zu verloren bist -> schreib mir ;)

    ansonsten hab ich ein kleines gerüst, damit du einen anhaltspunkt hast?

    (1) Funktion, die den Text kürzt -> nimmt einen string als parameter, nimmt nur die ersten 20 zeichen, fügt ein " (...)" an und gibt den neuen string zurück (benutze StringTrimRight und StringLen)

    (2) Datei in String einlesen [hast du ja schon gemacht] -> $text=...

    (3) regexp auf den string anwenden -> du bekommst einen array mit den sachen, die gekürzt werden müssen
    [HINWEIS: ich habe in meinem code die 2 rubriken nicht berücksichtigt, da ja in beiden der inhalt gleich eingeleitet wird??]

    (4) durch den array schleifen (for $teil in $results) - $text = StringReplace ($text, $teil, trim($teil) )

    fertig ;)

    ...naja, das war ja schon fast der ganze code.... puzzle das mal zusammen ;)

    viele Grüße,
    r4lf

  • Allen, die hier geantwortet haben, ganz herzlichen Dank, insbesondere @ r4lf!
    Das Problem ist bis auf ein paar Feinheiten gelöst.
    Wirklich tolles Forum.