Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Anfängerfragen zum Programmieren mit PureBasic.
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von proggernewbie »

Hallo Bisonte,

wow, das ist sehr hilfreich. So viele Mühe wollte ich euch allen gar nicht machen.
Dein Code ist super erklärt und ich stelle fest, dass ich einen Fehler bei der Aufgabenstellung gemacht habe.
Aber eure Codes haben mir schon sehr viel weiter geholfen. Ich muss nicht sofort hochkomprimierte und verschachtelte Codes schreiben, diesen Anspruch habe ich nicht an mich. Mir reicht es auch eine Zeile wie

Code: Alles auswählen

If SS:SS + Len(SigStart):SE = FindString(Input,SigEnd,SS,NoCase):If SE
auf mehrere Codezeilen aufzuteilen, damit ich besser nachvollziehen kann was da passiert auch wenn der PC dann ein paar Sekunden länger rechnet.
Was ich vergessen hatte zu erwähnen:
Ich habe selbstverständlich mit meiner zusammen gefrickelten Routine die 190 HTML-Seiten herunter geladen und in einem Verzeichnis gespeichert. Damit ich alle Quelltexte in eine Datei bekam, habe ich sie mir per Readfile 50-Dateien-weise lesen und im Debugger ausgeben lassen. Dann habe ich die Ausgabe des Debuggers kopiert und von Hand in eine Datei AnneWill_komplett1.html jeweils nacheinander eingefügt aund an die vorhergehenden Dateifragmente angefügt. Daraus entstand eine große Datei mit 190 x den Einträgen zum wechseln eine Seite zurück/vor, 2 Seiten zurück/vor usw.
Genau um diese 190 Einträge geht es mir, denn es ist schon ein Aufwand 30 Dateien so zu bearbeiten aber 6 - 7 Mal so viele...
Dafür fixiere ich mich so auf das Anfügen der Dateifragmente und auf das Löschen der jeweiligen Zeilen.
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von NicTheQuick »

proggernewbie hat geschrieben:...auf mehrere Codezeilen aufzuteilen, damit ich besser nachvollziehen kann was da passiert auch wenn der PC dann ein paar Sekunden länger rechnet.
Es ist total egal wie viele Leerzeilen, Leerzeichen, Tabs, Umbrüche, Doppelpunkte oder was weiß ich du benutzt. Der Code ist immer gleich schnell.
Mijikai hat einfach nur nicht schön programmiert, nur unübersichtlich, aber natürlich funktional. :wink:

Um mehrere Strings in eine Datei zu schreiben, erstelle sie mit CreateFile() und schreibe die einzelnen Strings nacheinander mit WriteStringN() rein. Danach mit CloseFile() schließen. Eigentlich nicht anders als deine Leseroutine. Im Grunde musst du also nur am Anfang deine Komplettdatei erstellen und öffnen, dann die Einzeldateien nacheinander öffnen, auslesen und in die Komplettdatei schreiben. Um die Einzeldateien komplett in einen String einlesen zu können, nutze die Zeile von Bisonte.

Code: Alles auswählen

ReadString(ID, #PB_UTF8|#PB_File_IgnoreEOL)
Bild
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von proggernewbie »

Nochmals vielen, vielen Dank an euch alle.
werde mich jetzt erst einmal mit den Codes eingehend auseinander setzen.
Das mit dem

Code: Alles auswählen

ReadString(ID, #PB_UTF8|#PB_File_IgnoreEOL)
zum Anfügen der Zeilen an einen Text, hat mir schon einmal sehr geolfen. Etwas muss ich natürlich auch basteln, will ja schließlich etwas daran lernen.
Somit schönes Wochenende
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von Bisonte »

proggernewbie hat geschrieben:Nochmals vielen, vielen Dank an euch alle.
werde mich jetzt erst einmal mit den Codes eingehend auseinander setzen.
Das mit dem

Code: Alles auswählen

ReadString(ID, #PB_UTF8|#PB_File_IgnoreEOL)
zum Anfügen der Zeilen an einen Text, hat mir schon einmal sehr geolfen. Etwas muss ich natürlich auch basteln, will ja schließlich etwas daran lernen.
Somit schönes Wochenende
Oh oh... Nicht verwechseln. ReadString() LIEST einen String aus einem File... Da wird nichts an einem Text angefügt.

Code: Alles auswählen

Ergebnis$ = ReadString(ID, #PB_UTF8|#PB_File_IgnoreEOL)
Das #PB_UTF8 bewirkt, das die Kodierung halt UTF8 sein soll (wegen üäö usw.: typische HTML Kodierung) und das verknüpfte
#PB_File_IgnoreEOL bewirkt nur, das Zeilenumbrüche zwar eingelesen werden, aber die Funktion
ReadString nicht bei einem Zeilenumbruch aufhört weiterzulesen.

Ansonsten müsste man, wie du das in deinem ersten Versuch gemacht hast, ALLE Zeilen einzelnd einlesen, zwischenspeichern
in (wie Glassjoe) einer Liste oder in ein Array...
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von GlassJoe »

proggernewbie hat geschrieben:Guten Morgen,

noch zur Erklärung: lese solche Sachen gerne auf dem Tablet oder Handy, wenn ich mit Bus und Bahn unterwegs bin, und da nerven viele Einzeldateien und bringen endlosen Datenmüll mit. Deshalb packe ich gerne so viel wie möglich in eine Datei.

@GlassJoe
vielen Dank für deinen Code und auch für deinen Zuspruch und deine Aufmunterung, aber puh. Das ist schon ziemlich harter Tobak für mich. Und gleich eine fertige Lösung präsentiert zu bekommen, war nicht meine Absicht. Nochmals danke dafür.
Ich hatte beabsichtigt die Position der Fundstellen zu berechnen und dann die Strings in der Länge von Anfang bis Ende aus den Fundstellen zu löschen. Leider saß ich nach Einfügen der Funktion FindString ratlos vor dem PC und wusste wieder einmal nicht weiter. Ist halt nicht so einfach für mich, habe sowieso seit einigen Jahren extreme Konzentrationsschwierigkeiten, und ich komme dann mit der Syntax und auch mit den Parametern nicht so recht klar. Gerade was Funktionen und Prozeduren angeht, stehe ich da ziemlich auf dem Schlauch.
Doch nun zu meinen Fragen:

Ist das Erstellen einer LinkedList notwendig oder ließen sich die gefundenen Positionen auch ohne den Einsatz der LinkedList aus den Quelltexten löschen?

Du zählst die Vorkommnisse von "username" und auch die von <br>. Die beiden CHR34 sind vermutlich die Anführungszeichen, die die beiden Anführungszeichen im Suchstring "username" maskieren. Ich hatte an dieser Stelle vor dem Einsatz von Findstring schon einmal die CHR10 und CHR 13 vor dem "username" eingesetzt, weil ich damit einen Zeilenumbruch erzwingen wollte. Hätte es mir erleichtert, die vorhirigen Strings am Ende der darüber stehenden Zeile abzuschneiden bzw zu löschen. Die Breaks <br> hatte ich nicht als Suchkriterium einbezogen, weil sie auch zwischen den einzelnen Abschnitten mal erscheinen, sondern meinen Suchstring genau vom Anfang dieser sich mit geänderten Seitenzahlen wiederholenden Auflistung versucht die Position zu ermitteln.

Weiter hatte ich überlegt einen Zeilenumbruch durch Suchen und Ersetzen im PB-Editor einzufügen (oder mit AOO Writer). Aber leider wurden keine Zeilenumbrüche eingefügt, oder wenn ich CHR(10)+CHR(13) eingefügt hatte nicht interpretiert, sondern waren im Seitentext dann lesbar. Wie könnte ich mittels Zeilenumbrüchen vor dem "username" den Kommentarbereich von den vorangehenden HTML-Tags trennen, damit mir ein leichteres Löschen möglich ist?

@ GlassJoe, @ H. Brill
Hatte mich auch schon einmal mit Regulären Ausdrücken beschäftigt, aber das ist mir viel zu hoch. Sobald ein String mehr Zeichen als drei enthält, und diese sich auch noch in Zahlen und Buchstaben aufteilen, muss ich kapitulieren. Habe dazu schon sehr viel auf einer Seite im Internet nach regex's gelesen und auch welche in der Eingabemaske "bauen" lassen. Leider geht da snicht bei diesen endlosen Strings.

Habe nur noch eine Frage zur Zeichenkodierung:
Nach dem Öffnen der Quelltexte im Editor (PB-Editor, Notepad usw werden Zeichen nur sehr komisch angezeigt. Habe dazu einen Screenshot gemacht. Weiß nur nicht, wie ich ihn hier ins Forum bekomme. Beim Anzeigen im Debugger stimmt unsere westdeutsche Textkodierung und ich kann problemlos alles lesen, wie müsste ich die Quelldateien öffnen und codieren, damit die Zeichen auch im Browser richtig angezeigt werden?

Erst einmal vielen Dank, muss mich etwas tiefer in den Code einlesen, um da wirklich durchzusteigen und werde mich bei Fragen noch einmal melden.
Schönen Tag noch.
Alfons

Ich wäre schon glücklich, wenn ich wenigstens mit den Stringfunktionen so weit fertig würde, dass ich wüsste, wann welche Parameter einzusetzen sind.
Es gibt immer zig wege sowas zu machen :) (wie du an all den geposteten Beispielen sehen kannst, geht es auch viel kürzer, deine Idee immer am <br> mittels chr(13) splitten zu lassen ist z.b eine davon)

Eine Linkedlist ist dabei nicht notwendig (hatte nur zuerst mit einer structurierten linked list mit 2 feldern angefangen, in der dann die zeile aus feld 1 gefiltert und das Resulat in feld 2 geschrieben wird, was auch ging ! aber es gab danach ein extrem unlogisches verhalten, wo der Inhalt der grade noch in Feld2 drin war, ausserhalb der Schleife einfach verloren ging. Hab debugged und probiert ohne Ende wo das Problem war, und konnte in 30-45 Min kein Problem und keine Lösung finden, sowas hab ich in 12 Jahren noch nicht erlebt ! also hab ich eine normale Linked List draus gemacht, und gleich die Ausgabe Linie in die Datei schreiben lassen)
nur mach ich sowas sehr gerne und pack es dann in eine Procedure weil das ein paar Vorteile hat.

1) Ich kann immer wieder das selbe Variablen Namen Schema benutzen (muss mich also nicht mit EnableExplicit rumschlagen) da alles in Proceduren ist. Kann also meine Standard Namen für Strings,Zähler und Positionen verwenden (tmp_p -> temporäre Position, tmp_c -> temporärer Zähler, tmp_str1$ -> temporärer String1)
Bei mir hat jede Variable die sich innerhalb einer Procedure abspielt ein tmp_ davor stehen, und alles was ausserhalb ist, entweder ein Global_ oder ein Main_ davor, und dann auch eine lange und ausführliche Bezeichnung. Weil da ist es wirklich wichtig drauf zu achten.

2) Du lernst die Linked List Funktion kennen ;)

3) Die Linked List ist beim Parsen von Vorteil wenn etwas in einer Schleife mit vielen durchgängen läuft, weil mann so besser im Debugger Kontrollieren kann wo etwas in einer Ausgabe Datei landen würde, an welcher Zeilen Position, Debug an den richtigen Stellen zu setzen fällt leichter. Mann kann genau feststellen wo das Problem ist. Ist es bevor, oder nachdem ich eingelesen habe ? Und mann kann Zeilen abhängig von Suchtreffern hoch und runter springen lassen ;)


EDIT: Hier ein Code den ich vor einem Jahr oder so für mich selbst geschrieben hab, es sind 4 String Parse Funktionen die ich öfter mal gebraucht hab.

Code: Alles auswählen

  Procedure.s CutOutText(InputText$,StartText$,StopText$,StartPos,StopPos,SearchMode,StartPosWhenXOccurrences)
    
    InputTextLen = Len(InputText$)
    
    If InputTextLen = 0
      ProcedureReturn
    EndIf
    
    If SearchMode = 0 ;/ Search StartText$ from StartPos and use StopText$
      Debug "MODE=0"
      
      ;[/ WORK !
      
      StartTextLen = Len(StartText$)
      StopTextLen = Len(StopText$)
      
      If StartTextLen = 0
        ProcedureReturn
      EndIf
      If StopTextLen = 0  
        ProcedureReturn 
      EndIf
      If StartPos = 0
        ProcedureReturn
      EndIf
      If StartPos >= InputTextLen
        ProcedureReturn
      EndIf
      
      StartTextFoundPos = FindString(InputText$,StartText$,StartPos)
      
      If StartTextFoundPos
        
        Debug "?1"  
        Debug StartTextFoundPos
        Debug StartTextFoundPos + StartTextLen
        
        
        StopTextFoundPos = FindString(InputText$,StopText$,StartTextFoundPos + StartTextLen)
        
        If StopTextFoundPos
          
          Debug "?2"
          Debug StopTextFoundPos
          
          ExtractedText$ = Mid(InputText$,StartTextFoundPos+StartTextLen,StopTextFoundPos - StartTextFoundPos - StartTextLen)
          If ExtractedText$
            ProcedureReturn ExtractedText$
          EndIf
          
        EndIf
        
      EndIf
      
      ;]
      
    ElseIf SearchMode = 1 ;/ Search StartText$ from StartPos and use Stop Pos
      Debug "MODE=1"
      
      ;[/ WORK !
      StartTextLen = Len(StartText$)
      
      If StartTextLen = 0
        ProcedureReturn
      EndIf 
      If StartPos = 0
        ProcedureReturn
      EndIf
      If StartPos >= StopPos
        ProcedureReturn
      EndIf 
      
      StartTextFoundPos = FindString(InputText$,StartText$,StartPos)
      
      If StartTextFoundPos
        
        Debug "?1"  
        Debug StartTextFoundPos
        Debug StartTextFoundPos + StartTextLen
        
        
        ExtractedText$ = Mid(InputText$,StartTextFoundPos,StopPos - StartTextFoundPos)
        ExtractedText$ = Right(ExtractedText$,Len(ExtractedText$) - StartTextLen)
       
        
        
        If ExtractedText$
          ProcedureReturn ExtractedText$
        EndIf 
        
      EndIf
      
      ;]
      
    ElseIf SearchMode = 2 ;/ Set Search StartPos when StartText$ is found the X nd Time then search until StopText$
      Debug "MODE=2"
      
      ;[/ WORK !
      
      StartTextLen = Len(StartText$) : StopTextLen = Len(StopText$)
      
      If StartPosWhenXOccurrences = 0
        ProcedureReturn
      EndIf
      If StartTextLen = 0
        ProcedureReturn
      EndIf
      If StopTextLen = 0  
        ProcedureReturn 
      EndIf 
      If CountString(InputText$,StartText$) < StartPosWhenXOccurrences
        ProcedureReturn
      EndIf 
      
      Repeat 
        TempPosition = FindString(InputText$,StartText$,TempPosition+1)
        If TempPosition
          FoundXTimes + 1
          If FoundXTimes = StartPosWhenXOccurrences
            StartPos = TempPosition + 1
            If StartPos >= InputTextLen 
              ProcedureReturn
            EndIf 
            Break
          EndIf
        EndIf 
      ForEver 
      
      Debug "START"
      Debug StartPos 
      
      StopTextFoundPos = FindString(InputText$,StopText$,StartPos)
      
      If StopTextFoundPos
        
        Debug "?2"
        Debug StopTextFoundPos
        
        ExtractedText$ = Mid(InputText$,StartPos,StopTextFoundPos - StartPos)
        If ExtractedText$
          ProcedureReturn ExtractedText$
        EndIf
        
      EndIf 
      
      ;]
      
    ElseIf SearchMode = 3 ;/ Set Search StartPos when StartText$ is found the X nd Time then search until StopPos
      Debug "MODE=3"
      ;[/ WORK !
      StartTextLen = Len(StartText$)
      
      If StartPosWhenXOccurrences = 0
        ProcedureReturn
      EndIf
      If StartTextLen = 0
        ProcedureReturn
      EndIf
      If StopPos = 0
        ProcedureReturn
      EndIf
      If CountString(InputText$,StartText$) < StartPosWhenXOccurrences 
        ProcedureReturn
      EndIf  
     
      Repeat 
        TempPosition = FindString(InputText$,StartText$,TempPosition+1)
        If TempPosition
          FoundXTimes + 1
          If FoundXTimes = StartPosWhenXOccurrences
            StartPos = TempPosition + 1
            If StartPos >= InputTextLen 
              ProcedureReturn
            EndIf 
            If StartPos >= StopPos
              ProcedureReturn
            EndIf
            Break
          EndIf
        EndIf 
      ForEver 
      
      Debug "START"
      Debug StartPos 
      
      ExtractedText$ = Mid(InputText$,StartPos,StopPos - StartPos)
      
      If ExtractedText$
        ProcedureReturn ExtractedText$
      EndIf 
      
      ;]
      
    EndIf 
    
  EndProcedure
  
  ;/ DEN STRING EINE ZEILE WEITER UNTEN IN EINE DATEI SCHMEISSEN UND DANN TESTEN
  ;/ <li>-- <a href="/dvd/31941.html" title="Bella is on Mad Sex Party - Lesbo Overload & The Cock Massage"><strong>Mad Sex Party - Lesbo Overload & The<br />
  
  ;/ ES SOLLTE DANN BEI ALLEN MODES IMMER DER STRING EINE ZEILE WEITER UNTEN RAUSKOMMEN
  ;/ ="Bella is on Mad Sex Party - L 
  
  If ReadFile(0,"C:\aaaa.txt")
    While Eof(0) = 0
      bla$ = ReadString(0) 
      Debug CutOutText(bla$,"title","esbo",31,#False,0,#False) 
      Debug "TRY NEXT MODE"
      Debug CutOutText(bla$,"title","",32,70,1,#False)
      Debug "TRY NEXT MODE" 
      Debug CutOutText(bla$,"title","",#False,#False,2,2)
      Debug "TRY NEXT MODE" 
      Debug CutOutText(bla$,"title","",#False,70,3,2) 
    Wend 
    CloseFile(0)
  EndIf
Und ja der Beispiel String ist der Titel von einem Porn :lol: :lol: :lol: :lol:

Es ist wichtig das du den PB Editor ordentlich anpasst, wenn du Probleme mit dem verstehen von Code hast.
Ich rate dir die Einrücklinien zu aktivieren (die haben mir sehr geholfen, ich hatte die selben Probleme wie du)
dazu die Färbung.

So sieht der Editor (ist nicht der Originale, aber der ist auch gut....ausser bei mir, da spinnt der rum) bei mir aus.

http://postimg.org/image/fbuff2x55/

Nicht wundern warum ich ;[ und ;[/ im Code habe ! Der Editor den ich benutze hat standardmässig auch ;[
zum Code falten statt nur ;{ und Falten lassen sich auch kräftig markieren & kommentieren mittels ;[/
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von Mijikai »

Diesmal lesbarer :wink:
Habe den Code nochmal verkleinert :)

Code: Alles auswählen

DeclareModule EXHELP
  Declare.i Extract(Url.s,FileName.s,Agent.s)
EndDeclareModule

Module EXHELP
  InitNetwork() 
  Global SE_Offset.i
  
  Procedure.s ExtractHelper(Input.s,Offset.i,SigStart.s,SigeEnd.s,NoCase.b)
    Protected SE.i, SS = FindString(Input,SigStart,Offset,NoCase)
    If SS
      SS + Len(SigStart)
      SE = FindString(Input,SigeEnd,SS,NoCase)
      SE_Offset = SE
      If SE
        ProcedureReturn Mid(Input,SS,SE-SS)
      EndIf
    EndIf
  EndProcedure
  
  Procedure.i Extract(Url.s,FileName.s,Agent.s)
    Protected Buffer.i, BufferSize.i, StringBuffer.s
    Protected FileHandle.i, UserName.s, Comment.s
    #SIG_USERNAME_START = "<span class=" + Chr(34) + "username" + Chr(34) + ">"
    #SIG_USERNAME_END   = "</span>"
    #SIG_COMMENT_START  = #SIG_USERNAME_END + " <p>"
    #SIG_COMMENT_END    = "<br><span class="
    #SIG_REPLACE_BR     = "<br>"
    Buffer = ReceiveHTTPMemory(Url,#PB_HTTP_NoRedirect,Agent)
    If Buffer
      BufferSize = MemorySize(Buffer)
      StringBuffer = PeekS(Buffer,BufferSize,#PB_UTF8|#PB_ByteLength)
      FreeMemory(Buffer)
      If StringBuffer
        FileHandle = CreateFile(#PB_Any,FileName)
        If FileHandle
          SE_Offset = 0
          UserName = ExtractHelper(StringBuffer,SE_Offset,#SIG_USERNAME_START,#SIG_USERNAME_END,#False)
          Comment = ExtractHelper(StringBuffer,SE_Offset,#SIG_COMMENT_START,#SIG_COMMENT_END,#False)
          While Comment
            Comment = ReplaceString(Comment,#SIG_REPLACE_BR,#CR$)
            WriteStringN(FileHandle,UserName)
            WriteStringN(FileHandle,Comment)
            WriteStringN(FileHandle,#CRLF$)
            UserName = ExtractHelper(StringBuffer,SE_Offset,#SIG_USERNAME_START,#SIG_USERNAME_END,#False)
            Comment = ExtractHelper(StringBuffer,SE_Offset,#SIG_COMMENT_START,#SIG_COMMENT_END,#False)
          Wend
          CloseFile(FileHandle)
          If SE_Offset
            ProcedureReturn #True
          EndIf
        EndIf
      EndIf
    EndIf
  EndProcedure
EndModule

Url.s = "https://daserste.ndr.de/common/apps/php/sophorum/thread/view?cmsid=5f5a9397-2dcd-45e6-ada0-53960678a7f7&id_page=1"
Debug EXHELP::Extract(Url,"extracted_test.txt",#Null$)

; IDE Options = PureBasic 5.60 (Windows - x64)
Zuletzt geändert von Mijikai am 14.07.2017 23:54, insgesamt 1-mal geändert.
proggernewbie
Beiträge: 19
Registriert: 23.03.2017 11:05
Computerausstattung: Win7 64bit, PureBasic 5.61 64bit
Linux Mint 19.1 64bit, PureBasic 5.71 64bit
VM (WinXP 32bit, PureBasic 5.71)
Wohnort: Kreis RE

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von proggernewbie »

Hallo noch einmal,

@bisonte
Dein Einwand

Oh oh... Nicht verwechseln. ReadString() LIEST einen String aus einem File... Da wird nichts an einem Text angefügt.


ist richtig. Natürlich wird damit keine Zeile angefügt. Anfügen lässt sich diese ausgelesene Zeile mit WriteString().
Soviel ist klar. War nur heute Morgen so überwältigt von eurer Hilfsbereitschaft und auch etwas erschlagen von den vielen unterschiedlichen Lösungsansätzen.
Wenn ich tatsächlich besser programmieren önnte, hätte ich versucht die (manuell erstellte) komplette Datei in den Speicher zu laden und die Strings da zu ersetzen. Hatte im Forum einen Beispielcode gefunden, mit dem ich schon einmal eine andere Aufgabenstellung sehr schön lösen konnte. aber wie gesagt: das Alter und meine mangelhafte Konzentration machen mir gerne einen Strich durch meine Rechnung. Muss mir irgendwie eine bessere Codeverwaltung aneignen.

@GlassJoe
Ist das nicht vollkommen egal, woher der Code, die Vorlage, der sonst etwas ist, mit dem wir arbeiten?
Hatte vor mehreren Jahren Kunden und Kundinnen, die von mir Hilfe beim Kopieren ihrer Privatpornos vom Handy auf den PC haben wollten.
Wenn man Geld verdienen will, muss man sich auch nicht unbedingt für so etwas zu schade sein. War natürlich ein indirektes Angebot doch bitteschön mitzumachen, aber wenn man professionell sein und bleiben will, dann ist es eben ein Job und man macht nicht mit.
Deine Codes sind so umfangreich, dass ich sie in Ruhe durcharbeiten muss. Dazu komme ich frühestens Dienstag wieder, vorher ist es mal eine halbe stunde der so, da bin ich dann zu schnell raus aus dem Thema. Danke dir aber sehr dafür, denn es kann mir nur helfen.

@ Mijikai
Gefühlsmäßig habe ich schon in etwa verstanden, was du in deinem ersten Code gemacht hast. Leider hätte ich es keinesfalls so gründlich auseinander klamüsern können wie Bisonte es getan hat und schon gar nicht so umfassen und detailliert kommentiert. Von daher war dein Code sehr gut (weil er mir die komprimierte Ladung entgegen gesetzt hat) und die anschließende gründliche Erklärung durch Bisonte hat mir sehr geholfen, die einzelnen Bestandteile besser zu verstehen und zu erkennen.
Hatte früher in der Schule Französischunterricht und habe diese Sprache zwar intuitiv richtig verstanden, wenn sie nicht zu schnell gesprochen wird (nicht in Frankreich, die Franzosen sind rücksichtslos, aber in Belgien sind sie entgegen kommender, da geht es), aber sprechen kann ich sie selbst nach zwanzig Jahren und vielen Versuchen nicht. Es bleibt eine Stammelei und Stotterei. Im Gegensatz dazu brauche ich beim Englisch nur einen halben bis einen Tag, dann spreche ich fats wie ein native speaker.
Ähnlich geht es mir, wenn ich solche Codes sehe. Ich erkenne die Eleganz und die Mächtigkeit, die darin steckt, aber ich kann sie nicht selbst erstellen und auch nicht so gründlich interpretieren wie Bisonte das gemacht hat.

Nach wie vor bleibt aber meine Frage, wie ich einen Zeilenumbruch eingefügt bekomme (egal ob CHR(10) oder #CRLF) den ich hinterher beim Suchen auswerten kann? Ich dachte immer, dass bis EOL gelesen wird und dann in die nächsthöhere Zeile gesprungen wird.

Für heute erst einmal gute Nacht und vielen, vielen Dank für die Masse an Anregungen und Hilfe.
LG
Alfons
Inzwischen 61 Jahre alt.
Leider immer noch keine große Programmiererfahrung; nach Burn-Out vor fünf Jahren, starke Schwächen mit der Merkfähigkeit.
Körperlich und geistig schreitet der Verfall eben voran.
Trotzdem möchte ich versuchen etwas programmieren zu lernen und bin dankbar für jede Hilfe.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von Mijikai »

proggernewbie hat geschrieben:...
Nach wie vor bleibt aber meine Frage, wie ich einen Zeilenumbruch eingefügt bekomme (egal ob CHR(10) oder #CRLF) den ich hinterher beim Suchen auswerten kann? Ich dachte immer, dass bis EOL gelesen wird und dann in die nächsthöhere Zeile gesprungen wird.
...
Hallo proggernewbie,

mit ReadString() wird immer bis EOL ausgelesen.
Um EOL später wieder Verwenden zu können muss EOL erneut eingefügt werden (String + #CRLF$).
(EOL ist nicht im ausgelesenen String enthalten!)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von Bisonte »

Um solche "Umbrüche" selbst einfügen, muss man die gewollte Stelle im String nur mit einem

Code: Alles auswählen

+ Chr(13) oder einem +Chr(10)
bestücken.

Code: Alles auswählen

String.s = "Hallo!" + Chr(13)


Bedeutet also das an das Ende von Hallo! noch ein CarriageReturn (Chr(13)) angehängt wird.

Mit FindString(String, Chr(13)) kann man danach dieses Zeichen (weil es handelt sich hierbei um ein solches)
natürlich wieder erkennen.
Man darf es allerdings nie mit Chr(0) machen, da dieses das Zeichen für Stringende bedeutet.

Code: Alles auswählen

String.s = "Hallo!" + Chr(0) + "Du Da!"

würde nur Hallo! ausgeben, da das Chr(0) den String dort "abschneidet".
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Textdatei bzw. HTML-Datei editieren, Stringfunktionen

Beitrag von juergenkulow »

Hallo,

Code: Alles auswählen

; Alle Kommentare im HTML-Format in eine TXT-Datei umwandeln. 
EnableExplicit
InitNetwork()
Define Url$ = "https://daserste.ndr.de/common/apps/php/sophorum/thread/view?cmsid=5f5a9397-2dcd-45e6-ada0-53960678a7f7&id_page="
Define AnzahlSeiten=190 
Define ZielDatei$="WillAnne170707.txt" ; notepad++ zeigt 6178 Zeilen, zum Teil sehr lange. 
Define AlleSeiten$=""
Define i
For i = 1 To AnzahlSeiten
  Debug "Seite:"+Str(i)
  Define *Speicher=ReceiveHTTPMemory(Url$+Str(i))
  If 0=*Speicher 
    Debug "Verbindungsfehler bei Seite: "+Str(i) 
  Else
    Define Antwort$=PeekS(*Speicher,MemorySize(*Speicher),#PB_UTF8) ; Inhalt von *Speicher in String umwandeln. 
    ; Suche alle Texte zwischen <HTML-Tags>.
    Define KlammerAufPosition = FindString(Antwort$,"<",1)           ; Suche eckige Klammer zu 
    Define Temp$=Left(Antwort$,KlammerAufPosition-1)                ; Sollte es Text vor der ersten Klammer geben.
    While KlammerAufPosition>0                                      ; Wenn es noch eine eckige Klammer auf gibt. 
      Define KlammerZu=FindString(Antwort$,">",KlammerAufPosition+1); Suche die eckige Klammer zu. 
      If KlammerZu>0
        KlammerAufPosition=FindString(Antwort$,"<",KlammerZu)         ; Suche eckige Klammer zu, wenn es keine gibt 0. 
        Temp$=Temp$+Mid(Antwort$,KlammerZu+1,KlammerAufPosition-KlammerZu-1) ;Speicher Text zwischen > und < in Temp$.
      Else
        KlammerAufPosition=0
      EndIf 
    Wend                                                                   ; Wenn die Schleife fertig ist steht der Text der Seite in Temp$ 
    Temp$=ReplaceString(Temp$,#TAB$+"Dieser Kommentarbereich ist geschlossen","")
    Define ZuSeite=FindString(Temp$,"Zu Seite: <") ; Finde Verweise auf andere Seiten. 
    If ZuSeite=0                                      ; wenn Zu Seite nicht gefunden wurde. 
      Zuseite=Len(Temp$) 
    EndIf 
    AlleSeiten$ = AlleSeiten$+Left(Temp$,ZuSeite-1) ; Füge die Antwort$ dieser Seite AlleSeiten$ hinzu. 
    FreeMemory(*Speicher)
  EndIf 
Next
Debug AlleSeiten$
Define Datei=CreateFile(#PB_Any,ZielDatei$) ; Schreibe das Ganze in eine Datei. 
If 0=Datei ; Wenn die Datei sich erzeugen läßt, z.B. wegen Schreibschutz.
  Datei=CreateFile(#PB_Any,GetUserDirectory(#PB_Directory_Documents)+ZielDatei$) ; Versuche Datei im Dokumentenverzeichnis zu erzeugen.
  If 0=Datei ; Im Fehlerfall kommt eine Meldung und Programmende. 
    Debug "Kann "+ZielDatei$+" und "+GetUserDirectory(#PB_Directory_Documents)+ZielDatei$+" nicht öffnen."
    End
  EndIf 
EndIf 
WriteString(Datei,AlleSeiten$)
CloseFile(Datei)
End 
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Antworten