![]() |
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; |
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; |
Re: Problem mit POS und COPY
Hiermit ...
Delphi-Quellcode:
... schreibst du jedesmal exakt deinen Suchstring in result[] (wenn er gefunden wurde). Ist das Absicht?
lang:=length(such);
anf:=pos(such, temp); if anf <> 0 then begin result[i]:=copy(temp, anf, lang); Dein memo2...-Befehl ist fehlerhaft (hinten bei der Klammer). Schau mal, ob du mit PosEx() etwas anfangen kannst. |
Re: Problem mit POS und COPY
Zitat:
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 :( |
Re: Problem mit POS und COPY
Hai Trax,
ich habe das eben mal so gemacht:
Delphi-Quellcode:
Benötigt werden: 1xButton, 1xEdit ein 1xMemo und 1xOpenDialog
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; |
Re: Problem mit POS und COPY
Zitat:
|
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: |
Re: Problem mit POS und COPY
Zitat:
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. |
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 |
Re: Problem mit POS und COPY
nen kleines Anwendungsbeispiel
Delphi-Quellcode:
mit
var deinString: String;
begin deinString := 'abcd abcde abcde';
Delphi-Quellcode:
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
foundpos := pos('abc', deinString);
Delphi-Quellcode:
schreibst so wird an position 2 deines strings angefangen zu suchen und somit wird "6" als ergebnis zurückgeliefert.
foundpos := posEx('abc', deinString, 2);
|
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' :( |
Re: Problem mit POS und COPY
Delphi-Quellcode:
nicht vergessen ;)
uses StrUtils
|
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? :? |
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; |
Re: Problem mit POS und COPY
danke
ich werd mal ein bischen damit rumbasteln... ;) |
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:
auch nichts
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; 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. |
Re: Problem mit POS und COPY
Zitat:
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; |
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: |
Re: Problem mit POS und COPY
Zitat:
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:
|
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 |
Re: Problem mit POS und COPY
Zitat:
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 18:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz