Autor Beitrag
DorJo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Di 10.03.09 03:25 
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:
ausblenden volle Höhe 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; //HTML-Result des PHP-Scripts
  lParams: TStringStream;
  I,a: Integer;
  str,dir,neu,alt,test: string;
  substr: widestring;
  txt,tab: TextFile;
  table: array [0..6of 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)>0then
      begin
        neu:='';
        alt:='';
        for a := Length(table[i])+3 to (AnsiPos('~'+table[i+1]+'~',substr)-1do
        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])+2to 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 10.03.09 10:52 
Hast du schon gedebugged?

Das einzige, was mir auf Anhieb auffällt, ist, daß du die Laufvariable 'i' nicht initialisierst.
DorJo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Di 10.03.09 13:10 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Do 12.03.09 21:06 
*push* Fällt dem keinem was ein?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 13.03.09 10: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Mo 16.03.09 07: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 16.03.09 11: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Mo 16.03.09 15:50 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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!