Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Problem mit Parsen von widestrings
DorJo - Di 10.03.09 02:25
Titel: Problem mit Parsen von widestrings
Hi @ all,
ich hab mal wieder ein paar graue Haare mehr bekommen.
Mein Problem ist folgendes: Über die IdHTTP Kompo funkte ich ein php skript an. Das gibt mir den Inhalt einer Datenbank aus. Dies tut es hintereinander weg, damit ich nicht nach umbrüchen parsen muss. Den Inhalt speicher ich in eine tmp datei. Bis hierhin kein Problem ^^
Dann habe ich folgenden Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83:
| procedure TForm1.Button8Click(Sender: TObject); var lStream: TMemoryStream; lParams: TStringStream; I,a: Integer; str,dir,neu,alt,test: string; substr: widestring; txt,tab: TextFile; table: array [0..6] of string; begin table[0]:='tab'; table[1]:='tabcfg'; table[2]:='tabareacfg'; table[3]:='htmltext'; table[4]:='project_categories'; table[5]:='projects_bak'; table[6]:='projects'; str:=''; GetDir(0,dir); if not Assigned(IdHttp1) then exit; lStream := TMemoryStream.create; lParams := TStringStream.create(''); try IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded'; IdHttp1.get(internetseite,lStream); SetLength(str,lStream.Size); lStream.Position:=0; lStream.ReadBuffer(str[1],lStream.Size); except on E: Exception do showmessage('Fehler bei der Übertragung: ' + E.message); end; lstream.SaveToFile(dir+'\test.tmp'); AssignFile(txt,dir+'\test.tmp'); Reset(txt);
while i<=6 do begin AssignFile(tab,dir+'\'+table[i]+'.tmp'); Rewrite(tab); if alt<>'' then Writeln(tab,alt);
while not Eof(txt) do begin substr:=''; Readln(txt,substr); if i<6 then begin test:='~'+table[i+1]+'~'; if (AnsiPos(test,substr)>0) then begin neu:=''; alt:=''; for a := Length(table[i])+3 to (AnsiPos('~'+table[i+1]+'~',substr)-1) do begin neu:=neu+substr[a]; end; if ((Ansipos('~'+table[i+1]+'~',substr)+Length(table[i+1])+2)<Length(substr)) then begin for a := (AnsiPos('~'+table[i+1]+'~',substr)+Length(table[i+1])+2) to Length(substr)-1 do begin alt:=alt+substr[a]; end; end; Writeln(tab,neu); i:=i+1; CloseFile(tab); break; end else Writeln(tab,substr); end; end; end;
lParams.Free; lStream.Free; CloseFile(txt); CloseFile(tab); ShowMessage('FERTIG'); end; |
Ich habe also einen Array table in dem die Schlüsselwörter drin sind. Diese sind im text durch ~*~ gekennzeichnet. Beim ersten Element des Arrays funktioniert es einwandfrei, aber dann überhaupt nicht mehr :( Er findet dann die Zeichenkombi ~tabareacfg~ nicht mehr :( Obwohl sie doch da ist.
Ich weiß einfach nicht mehr weiter und finde meinen fehler nicht!
Habt ihr vielleicht eine Ahnung?
Danke schonmal im Vorraus!
MfG
DorJo
Th69 - Di 10.03.09 09:52
Hast du schon gedebugged?
Das einzige, was mir auf Anhieb auffällt, ist, daß du die Laufvariable 'i' nicht initialisierst.
DorJo - Di 10.03.09 12:10
Th69 hat folgendes geschrieben : |
| Hast du schon gedebugged? |
Hmm. Das Problem war immer das, dadurch, dass ich keine Zeilenumbrüche mache die erste Zeile unglaublich lang ist und da dann schon das übernächste keyword (also das 3.) schon in dieser Zeile ist. Das ist der Fehler. Ich sollte vllt. vorher einfach mal immer nach 300 Zeichen einen Zeilenumbruch manuell einfügen! Oder fällt euch da spontan noch eine elegantere Lösung ein?
Hmm, ne. Das ist auch nicht der Wahrheit letzter Schluss. Weil ja auch in einer kürzeren Zeile mehrer Schlüsselwörter stehen können. Aber mir fällt da jetz überhaupt keine Lösung ein. Wisst ihr vielleicht einen besseren Algorithmus?
DorJo - Do 12.03.09 20:06
*push* Fällt dem keinem was ein?
Th69 - Fr 13.03.09 09:56
Du hast ja selbst schon erkannt, daß dein Source-Code den falschen Weg geht.
Dein Source-Code ist außerdem schrecklich programmiert, so daß ein Außenstehender den Code nicht verstehen kann...
Überleg dir erst den Algorithmus und dann setze ihn in Source-Code um.
Mein Ansatz wäre folgender:
- Jede Zeile lesen
- je Zeile nach ALLEN Schlüsselwörtern suchen und diese dann bearbeiten (Anmerkung: ich verstehe z.B. nicht, was du dann geanu machst!!!)
P.S. Du brauchst die Position nur einmal zu suchen und dann damit zu arbeiten, anstatt x-mal die Funktion 'AnsiPos' mit demselben Parameter aufzurufen!
DorJo - Mo 16.03.09 06:22
Ist der wirklich so schlimm? :(
Ich denke nicht das dein Vorschlag funktioniert th69. Es geht doch um folgendes: Ich habe einen Text, welcher von einem Skript ausgegeben wurde. Dieser Text ist in eine datei gespeichert und wird dann zeilenweise ausgelesen. Dabei kann eine Zeile, wie bereits gesagt, sehr lang werden. Der Text ist gespickt mit Schlüsselwörtern. Diese kommen jeweils nur einmal im gesamten Text vor und sind in dem array "table" gespeichert. Nach jedem Schlüsselwort steht ein Text, welcher, natürlich nur bis zum nächsten Schlüsselwort, nun ausgelesen werden und in eine andere Textdatei, welche den gleichen Namen wie der aktuelle Schlüssel hat, geschrieben werden soll.
Klingt eigentlich überhaupt nich schwer, aber ich habe da grad irgendwie ein Brett vorm Kopf! :oops:
Wisst ihr da was?
MfG
Th69 - Mo 16.03.09 10:52
Ok, nun weiß ich wenigstens was du genau machen willst (dies hättest du auch schon im ersten Post angeben können).
Ich würde die Datei als ganzes einlesen (ein langer String).
Nun ermittels du einmalig für alle Schlüsselwörter die Positionen (AnsiPos) und schreibst jeweils mittels SubString den Text in die entsprechende Datei.
DorJo - Mo 16.03.09 14:50
Th69 hat folgendes geschrieben : |
Ok, nun weiß ich wenigstens was du genau machen willst (dies hättest du auch schon im ersten Post angeben können).
Ich würde die Datei als ganzes einlesen (ein langer String).
Nun ermittels du einmalig für alle Schlüsselwörter die Positionen (AnsiPos) und schreibst jeweils mittels SubString den Text in die entsprechende Datei. |
Nunja, das klingt gut, aber ist das nicht relativ ungünstig, weil das ja wirklich sehr lang sein kann! Aber danke erstmal für den Ansatz!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!