![]() |
Bestimmten String zählen?
Hallo!
Wie kann ich in Delphi zählen, wie oft ein bestimmter String in einer StringList oder einem Memo-Feld vorkommt? Hab über die Foren-Suche immer nur gefunden, wie mman ganz allgemein Wörter zählt (klärt mich auf wenn ich falsch liege)... MCXSC |
Re: Bestimmten String zählen?
ganz einfach:
Delphi-Quellcode:
var LText : String;
LCount, LPos : Integer; begin LCount := 0; LText := Memo1.Lines.Text; LPos := PosEx('TeilString', LText, 1); while (LPos > 0) do begin inc(LCount); LPos := PosEx('TeilString', LText, LPos + 1); end; showmessage('Der String wurde ' + IntToStr(LCount) + ' mal gefunden.'); end; |
Re: Bestimmten String zählen?
Super, funktioniert einwandfrei...
Bis auf einen kleinen Fehler, was aber - denk ich mal - nicht am Code direkt liegt: Wörter z.B. "Komödie" werden überhaupt nicht gefunden, was - ich denke mal - am Umlaut "ö" liegt? Wie kann es des beheben? MCXSC |
Re: Bestimmten String zählen?
eigentlich dürfte es keine Probleme mit "ö" etc. geben. Vielleicht hast du ja Probleme mit Groß-/Kleinschreibung. Sollte aber mit Ansilowercase/AnsiUppercase auch kein Problem sein.
|
Re: Bestimmten String zählen?
Nee, daran liegt es nicht...
Ich denke mal es liegt an der Kodierung? Habe den text aus dem Memo-Feld vorher in einer XML-Datei gespeichert (verwende dazu die Unit OmniXML_MSXML). Kann es daran liegen? //Edit: Okay, daran liegt es wahrscheinlich nicht, denn wenn ich die XML-Datei mit Notepad öffne, stet da auch "Komödie"... Die Listen mit den Wörtern, die zu zählen sind, sind ja vorher aus der Datei herauskopiert worden, weshalb es nict an der Groß-/Kleinschreibung liegen dürfte... |
Re: Bestimmten String zählen?
kannst du mal so eine Liste anhängen und angeben welches Wort gezählt werden soll? wie lädst du die Datei in die Stringlist? Mit LoadFromFile? Ist die Datei eventuell Unicode?
|
Re: Bestimmten String zählen?
Also, lade es folgendermaßen (ich weiß: sehr unsauber :oops: ):
Delphi-Quellcode:
liste := tstringlist.create;
//Auslesen der zu suchenden Wörter liste.Sort; for i:=0 to liste.Count-1 do begin LCount := 0; ltext1 := tstringlist.create; //Laden Textdatei in eine StringList LText1.LoadFromFile(form1.datenbank_geladen_datei); Ltext := LText1.Text; puffer_test := '<genre1>'+liste[i]+'</genre1>'; LPos := PosEx(puffer_test, LText, 1); while (LPos > 0) do begin inc(LCount); LPos := PosEx(puffer_test, LText, LPos + 1); end; //Dann würde die Ausgabe folgen Zitat:
Zitat:
|
Re: Bestimmten String zählen?
du kannst es feststellen indem du die Datei mal mit Notepad öffnest und dann auf "Speichern unter" gehst. Dann zeigt es dir beim Typ an ob du es als ascii oder unii speicherst.
|
Re: Bestimmten String zählen?
Da ist als Codierung "UTF-8" ausgewählt...
//Edit: Habe es jetzt mal noch mit ä und ü getestet... es liegt wahrscheinlich an den Umlauten, da diese auch nicht gefunden werden... |
Re: Bestimmten String zählen?
echt komisch, ich hatte mit "ü", "ä" etc. nie probleme in verbindung mit pos, posex etc.
|
Re: Bestimmten String zählen?
Liste der Anhänge anzeigen (Anzahl: 1)
Kann es nicht doch an der UTF-8-Codierung liegen? Aber im Notepad werden die Wörter gefunden...
//Edit: Hab grad mal in den Durchlauf der Liste mit den zu suchenden Wörtern für jeden Eintrag eine ShowMessage hinzugfügt, da wird komischerweise auch korrekt "Komödie" angezeigt, scheint also ganz normaler "Klartext" zu sein... Weiß keiner nen Rat? :cry: :cry: :cry: |
Re: Bestimmten String zählen?
kannst du mal die datenbank geladene Datei anhängen?
|
Re: Bestimmten String zählen?
Hier eine kleine Starthilfe:
Delphi-Quellcode:
Grüße vom marabu
function Occurrences(xn: IXMLNode; const literal: String): Cardinal;
var Count: Cardinal; i, iPos: Integer; dn: IDOMNode; nl: IDOMNodeList; s: String; begin Count := 0; nl := (xn.DomNode as IDOMNodeSelect).selectNodes('//text()'); for i := 0 to Pred(nl.length) do begin dn := nl.item[i]; s := dn.nodeValue; iPos := Pos(literal, s); while iPos > 0 do begin Inc(Count); iPos := PosEx(literal, s, iPos + Length(literal)); end; end; Result := Count; end; procedure TDemoForm.CountButtonClick(Sender: TObject); begin with XMLDocument do begin FileName := 'Meine Filme.xml'; Active := true; ShowMessage(IntToStr(Occurrences(DocumentElement, 'Ärzte'))); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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