Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit POS und COPY (https://www.delphipraxis.net/23070-problem-mit-pos-und-copy.html)

Trax 28. Mai 2004 10:46


Problem mit POS und COPY
 
Hallo alle zusammen.

Ich habe ein kleines Problem.
Ich habe in einer whatever.txt file einen beliebigen text stehen.

Bsp:
"Alle meine Entcheeeeeeen
Schwimmen in einem Seeeeeeee"

Ich versuche nun aus dem Text alle e's rauszusuchen
mein code zeigt aber nur 2 gefundene e's in Zeile 1 und Zeile 2
ich hab keine ahnung wie ich es schaffe alle e's zu lesen

Habs mit einer schleife probiert, hat aber nicht geklappt :gruebel:
Der folgende source funktioniert... findet aber nur immer 1 string in 1 zeile

Kann mit da jemand unter die arme greifen?

Vielen Dank schonmal im voraus! :cheers:

Delphi-Quellcode:
procedure TForm1.SuchButtonClick(Sender: TObject);
var
temp :string;
such :string;
result :array[0..100] of string;
i, j, anf, lang: integer;
begin
such:=edit1.Text;
Reset(Txt);
i:=0;
j:=0;
While not EOF(txt) do
  begin
  ReadLN(Txt, temp);
  lang:=length(such);
  anf:=pos(such, temp);
  if anf <> 0 then
    begin
    result[i]:=copy(temp, anf, lang);
    memo2.lines.add('Gefunden in Zeile '+inttostr(j)+');
    inc(i);
    end;
  inc(j);
  end;
end;

Kasoft 28. Mai 2004 11:11

Re: Problem mit POS und COPY
 
Hi Trax,

ich hab mal deinen Code kurz überflogen aber nicht alles:
Also pos gibt dir immer die Position von dem ersten Substring
aus dem String aus. Alle weiteren ignoriert er. Aber du könntest
mit einer for Schleife die Strings selber analysieren.

Pseudocode nicht getestet!!!:
Code:
for i:=0 to length(deinstring) do  //deinstring wird mit Readln ausgelesen
begin
  if uppercase(deinstring[i]) = uppercase('e') then  //uppercase nur um GROß kleinschreibung
    ...mach irgendwas wie z.B. ausgeben oder so...   //zu ignorierern.
end;

IngoD7 28. Mai 2004 11:30

Re: Problem mit POS und COPY
 
Hiermit ...
Delphi-Quellcode:
  lang:=length(such);
  anf:=pos(such, temp);
  if anf <> 0 then
    begin
    result[i]:=copy(temp, anf, lang);
... schreibst du jedesmal exakt deinen Suchstring in result[] (wenn er gefunden wurde). Ist das Absicht?

Dein memo2...-Befehl ist fehlerhaft (hinten bei der Klammer).

Schau mal, ob du mit PosEx() etwas anfangen kannst.

Trax 28. Mai 2004 11:34

Re: Problem mit POS und COPY
 
Zitat:

Zitat von IngoD7
Hiermit ...
Delphi-Quellcode:
  lang:=length(such);
  anf:=pos(such, temp);
  if anf <> 0 then
    begin
    result[i]:=copy(temp, anf, lang);
... schreibst du jedesmal exakt deinen Suchstring in result[] (wenn er gefunden wurde). Ist das Absicht?

Dein memo2...-Befehl ist fehlerhaft (hinten bei der Klammer).

Schau mal, ob du mit PosEx() etwas anfangen kannst.

das mit der absicht kann ich bejahen
nur so weiß ich wie ich das am ende ins memo schreiben kann :D
ansonsten das mit dem memo stimmt
ich hab meinen result text am ende falsch "gekürzt"


mit PosEx() kann ich noch nichts anfangen
ich werd aber mal in die help schauen, obwohl die leider auf englisch ist :(

Sharky 28. Mai 2004 12:33

Re: Problem mit POS und COPY
 
Hai Trax,

ich habe das eben mal so gemacht:

Delphi-Quellcode:
procedure TForm1.Sucheeee(datei, suchwort: string; var mem: TMemo);
var
  sl: TStringList;
  ndx: Integer;
  position: Integer;
  tmpstr1: string;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(datei); // Datei laden
    for ndx := 0 to sl.Count - 1 do //alle Zeilen des Textes durchgehen
    begin
      tmpstr1 := sl.Strings[ndx];
      position := 0;

      // solange noch Text in der aktuellen Zeile ist der dem suchwort
      // entsprächen könnte suche weiter
      while (length(tmpstr1) > (Length(suchwort))) do
      begin
        if (copy(tmpstr1, 1, Length(suchwort)) = suchwort) then //vergelichen
        begin
          mem.Lines.Add(Format('Suchwort gefunden Zeile %d an position %d', [ndx + 1, position + 1]));
        end;
        Delete(tmpstr1, 1, Length(suchwort));
        INC(position,Length(suchwort));
      end;
    end;
  finally
    FreeAndNil(sl);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if (OpenDialog1.Execute) then
  begin
    Sucheeee(OpenDialog1.FileName, Edit1.Text, memo1);
    Application.ProcessMessages;
  end;
end;
Benötigt werden: 1xButton, 1xEdit ein 1xMemo und 1xOpenDialog

IngoD7 28. Mai 2004 13:04

Re: Problem mit POS und COPY
 
Zitat:

Zitat von Trax
mit PosEx() kann ich noch nichts anfangen

Ist fast dasselbe wie Pos(), nur dass man bei PosEx() angeben kann, wo die Suche im String beginnen soll (bei Pos() immer beim ersten Zeichen).

Trax 28. Mai 2004 17:40

Re: Problem mit POS und COPY
 
Danke für die vielen Antworten vor allem auch an Sharky für eine Lösung
aber ich MUSS das leider mit POS machen und ich bin leider nicht in der lage aus der lösung eine auf meinen code funktionierende lösung zu machen :wall:

mein code bearbeitet/behandelt ja jede zeile als einen einzigen string
wie ist es möglich, diesen konkreten string, nachdem schon 1 gesuchter begriff gefunden wurde, zu einer art "RestString" zu machen um dann diesen "rest"lichen Bereich des Strings zu durchsuchen?

denn anders wüsste ich nicht wie es theoretisch gehen sollte :(

danke schon mal an alle :angle2:

IngoD7 28. Mai 2004 22:58

Re: Problem mit POS und COPY
 
Zitat:

Zitat von Trax
wie ist es möglich, diesen konkreten string, nachdem schon 1 gesuchter begriff gefunden wurde, zu einer art "RestString" zu machen um dann diesen "rest"lichen Bereich des Strings zu durchsuchen?

Mit PosEx bräuchtest du das nicht. Ansonsten: Siehe Hilfe unter Delete, Copy, Pos, PosEx.

Versuche es zu verstehen und probiere es aus (auch die Lösungsvorschläge hier). Das ist quasi das kleine 1 x 1 der Stringbearbeitung. Es zu erlernen bringt dir mehr, als hier auf eine perfekt passende Copy&Paste-Lösung zu warten.

Trax 29. Mai 2004 10:10

Re: Problem mit POS und COPY
 
hi
also unter PosEx finde ich in meine delphi hilfe (6) nichts
könntest du mir ein anwendungsbeispiel geben.

es ist mir immer noch nicht gelungen dies umzusetzten :(

bin für jede hilfe dankbar

SirThornberry 29. Mai 2004 10:16

Re: Problem mit POS und COPY
 
nen kleines Anwendungsbeispiel
Delphi-Quellcode:
var deinString: String;
begin
  deinString := 'abcd abcde abcde';
mit
Delphi-Quellcode:
  foundpos := pos('abc', deinString);
bekommst du immer 1 zurück weil pos immer ganz vorne im string anfängt zu suchen und "abc" an position 1 vorkommt. Wenn du jetzt aber
Delphi-Quellcode:
  foundpos := posEx('abc', deinString, 2);
schreibst so wird an position 2 deines strings angefangen zu suchen und somit wird "6" als ergebnis zurückgeliefert.

Trax 29. Mai 2004 10:20

Re: Problem mit POS und COPY
 
Danke für die schnelle antwort
Hab das grad schnell probiert und bekomme

[Error] Unit1.pas(57): Undeclared identifier: 'posEx'

:(

Matze 29. Mai 2004 10:22

Re: Problem mit POS und COPY
 
Delphi-Quellcode:
uses StrUtils
nicht vergessen ;)

Trax 29. Mai 2004 10:25

Re: Problem mit POS und COPY
 
in meiner unit habe ich folgende uses

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils;

kann es sein das es PosEx nicht in delphi 6 personal gibt? deswegen auch nichts in der hilfe? :?

SirThornberry 29. Mai 2004 10:28

Re: Problem mit POS und COPY
 
Stimmt, hab grad geschaut, in meinem D6 personal gibts die funktion auch nicht. Hab sie mal aus D7 rauskopiert
Delphi-Quellcode:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
  I,X: Integer;
  Len, LenSubStr: Integer;
begin
  if Offset = 1 then
    Result := Pos(SubStr, S)
  else
  begin
    I := Offset;
    LenSubStr := Length(SubStr);
    Len := Length(S) - LenSubStr + 1;
    while I <= Len do
    begin
      if S[I] = SubStr[1] then
      begin
        X := 1;
        while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
          Inc(X);
        if (X = LenSubStr) then
        begin
          Result := I;
          exit;
        end;
      end;
      Inc(I);
    end;
    Result := 0;
  end;
end;

Trax 29. Mai 2004 10:48

Re: Problem mit POS und COPY
 
danke
ich werd mal ein bischen damit rumbasteln... ;)

Trax 29. Mai 2004 14:44

Re: Problem mit POS und COPY
 
bitte hab jemand erbarmen mit mir.

Ich hab es mit posEx probiert, aber das problem mit dem "rest"string konnte ich nicht lösen. :(

dann hab ich folgendes probiert:

Delphi-Quellcode:
While not EOF(txt) do
  begin
  ReadLN(Txt, temp);
  lang:=length(such);
  anf:=pos(such, temp);
   while anf <> 0 do
    begin
    result[i]:=copy(temp, anf, lang);
    anf:=pos(such, copy(temp, anf+1, lang));
    memo2.lines.add('Suche erfolgreich! Ich fand in Zeile '+inttostr(j)+' das Ergebnis '+result[i]);
    inc(i);
    end;
  inc(j);
  end;
end;
auch nichts

Mittlerweile bin ich bereit auch dafür zu bezahlen. ich hab sowas von keine ahnung mehr und eine riesige :wall: vorm kopf.

Ich überweise gerne was für ne richtige lösung, die lern ich dann und damit hats sich.

IngoD7 29. Mai 2004 22:17

Re: Problem mit POS und COPY
 
Zitat:

Zitat von Trax
bitte hab jemand erbarmen mit mir.

[...]
Mittlerweile bin ich bereit auch dafür zu bezahlen. [...] Ich überweise gerne was für ne richtige lösung, die lern ich dann und damit hats sich.

Jau! :roll: Wie oft willst du in Zukunft denn noch bezahlen??? Dann zahle jetzt Sharky etwas. Der hat schon eine Möglichkeit gepostet. Aber die lernst du nicht. Die kannst du nicht einmal ein- und umsetzen. Das ist allerdings auch völlig normal, wenn man sich mit den Dingen, die man schaffen möchte, nicht selber vertraut macht. Ob du das nicht kannst oder nicht willst, vermag ich nicht zu beurteilen. Notwendig ist es in jedem Fall.

Ich bleibe also dabei: Es ist das kleine 1 x 1 der Stringbearbeitung, und das solltest du lernen.

Siehe meine Kommentare im Code (möglichst unverändert gelassen).

Delphi-Quellcode:
While not EOF(txt) do
  begin
  ReadLN(Txt, temp);
  lang:=length(such);
  anf:=pos(such, temp);
   while anf <> 0 do
    begin
    result[i]:=copy(temp, anf, lang); //Ist hier dasselbe wie result[i]:=such;
    //Du schreibst dein array result[] voll mit such. Ich frage mal nicht, wieso ....
    {anf:=pos(such, copy(temp, anf+1, lang)); } //Für die Tonne.
    memo2.lines.add('Suche erfolgreich! Zeile '+inttostr(j)+' das Ergebnis '+result[i]);
    delete(temp,1,anf+lang-1); //Hier wird alles bis zum gefundenen such (einschließlich) vorne
                                //von temp abgeschnitten
    anf:=pos(such, temp); //Hier erneute Suche im Rest von temp.
    inc(i);
    end;
  inc(j);
  end;
end;

Trax 30. Mai 2004 11:43

Re: Problem mit POS und COPY
 
Danke für die antwort ingo aber ich kann deinen kommentar nicht nachvollziehen
der source war doch fast fertig
wo ist das problem? ich hatte bisher nur keine ahnung vom delete command und konnte ihn aus dem ersten source nicht anwenden.
na und?
jetzt hab ich gesehen wies funkt und gut is.

passiert
bin halt kein toller programmierer, will ich auch gar nicht werden.
so what? :)

Ich kann den source jetzt lernen, verstehe delete und kann es beim nächsten mal anwenden.
wunderbar und reicht mir völlig.

Danke noch mal für die hilfe :dp:

IngoD7 30. Mai 2004 19:59

Re: Problem mit POS und COPY
 
Zitat:

Zitat von Trax
Danke für die antwort ingo aber ich kann deinen kommentar nicht nachvollziehen

Das will ich dir erklären.

Ich habe keine Lust zu so etwas und fühle mich leicht veräppelt, wenn ich glaube festzustellen, dass der Hilfesuchende selber das ihm Mögliche nicht versucht, um sein Problem zu lösen. Statt dessen wird gewartet, bis zum Schluß doch einer den Copy&Paste-fähigen Code postet. Und wenn das zu lange dauert, wird sogar Geld angeboten.

Verstehe mich bitte richtig, ich weiss, dass es manchmal im Oberstübchen blockiert sein kann und man keinen wirklichen Ansatz erkennen und verfolgen kann. Sowas gibt es, bei dir, bei mir, bei jedermann - kein Problem. Aber die Hinweise zur Selbsthilfe hatte ich in einem früheren Posting hier im Thread gegeben:
Zitat:

Ansonsten: Siehe Hilfe unter Delete, Copy, Pos, PosEx.

Versuche es zu verstehen und probiere es aus (auch die Lösungsvorschläge hier). Das ist quasi das kleine 1 x 1 der Stringbearbeitung. Es zu erlernen bringt dir mehr, als hier auf eine perfekt passende Copy&Paste-Lösung zu warten.
Es wäre für dich ein Leichtes gewesen, die erwähnten String-Grundbefehle in der Hilfe nachzulesen, mit ihnen ein kleines Testprogrämmchen zu machen und zu experimentieren und zu probieren und dann später auch zu verstehen. Das hast du aber einfach nicht getan. Warum nicht?

Trax 30. Mai 2004 20:44

Re: Problem mit POS und COPY
 
das muss wirklich ein missverständnis sein
ich habe es nämlich wirklich versucht
und zwar so lange bis ich die schnauze -auf gut deutsch- voll hatte
und weil ich es können MUSS bin ich auch bereit etwas dafür zu bezahlen... so funktioniert es nunmal
mein problem war a) das posex in meiner delphi hilfe nicht vorhanden ist
und das ich b) unter delete in der hilfe nur bei command, example, ... aber NICHT (dumm, ich weiß) bei procedure geschaut habe
den eintrag hab ich nämlich erst deiner lösung gesehen
copy und pos kannte ich schon vorher

deswegen war deine erste hilfe vorerst für mich abgehackt gewesen

IngoD7 31. Mai 2004 07:12

Re: Problem mit POS und COPY
 
Zitat:

Zitat von Trax
und zwar so lange bis ich die schnauze -auf gut deutsch- voll hatte

:mrgreen: Soll vorkommen ....

Zur Hilfe: Nagut, die ist manchmal gewöhnungsbedürftig. Geht mir auch so.

Alles klar.
Bis zum nächsten Mal. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz