![]() |
AW: String intelligent Kürzen
Übernehme den Teil aus meiner Version
|
AW: String intelligent Kürzen
Cool, das funktioniert sogar :)
Nur damit ich es auch verstehe, zu was ist eigentlich der Record US da? Nochmal vieeeeelen Dank an euch zwei!! Die Funktion macht nun genau das was sie soll und das sogar besser als erwartet :-D |
AW: String intelligent Kürzen
Das ist eine Bitmaske, wenn ein Name schon vorhanden ist, dann werden über diese Maske, beim nächsten Durchgang, Löschaktionen übersprungen, so daß ein anderer Name entsteht.
Obwohl noch ein
Delphi-Quellcode:
bei
i := Length(S);
Delphi-Quellcode:
fehlt, sollte dennoch die Zahl erhalten bleiben, da das Ganze ohne mit 0 initialisiert würde (durch die vorherige For-Schleife) :gruebel:
// ungültige Zahlen entfernen
[edit] ah, hatte hier nur eine zweistellige Zahl drin, wlche erfolgreich durchkam :wall:
Delphi-Quellcode:
Dürfen die Zahlen eigentlich ebenfalls gekürzt werden?
type TKueDatErlaubt = function(S: String): Boolean;
function KuerzeDateiname(S: String; Len: Integer; Erlaubt: TKueDatErlaubt): String; var i, i2, u: Integer; SL: TStrings; US: record case Integer of 0: (i: Int64); 1: (s: Set of 0..63); end; begin // ungültige Zeichen entfernen for i := Length(S) downto 1 do if not (S[i] in [' ', 'a'..'z', 'A'..'Z', '0'..'9']) then Delete(S, i, 1); // ungültige Zahlen entfernen i := Length(S); while (i > 0) and (S[i] in ['0'..'9']) do Dec(i); for i := i downto 1 do if (S[i] in ['0'..'9']) then Delete(S, i, 1); // SL := TStringList.Create; try US.s := []; repeat U := 0; // String aufsplitten SL.LineBreak := ''; SL.Delimiter := ' '; SL.StrictDelimiter := True; SL.DelimitedText := S; // längstes Wort suchen + Capitalize i2 := 0; for i := SL.Count -1 downto 0 do begin SL[i] := UpperCase(Copy(SL[i], 1, 1)) + LowerCase(Copy(SL[i], 2)); i2 := Max(i2, Length(SL[i])); end; // Anzahl der zu entfernenden Zeichen Len := Length(SL.Text) - Len; // kurze Wörter (Einzelbuchstaben) entfernen i := SL.Count - 1; while (Len > 0) and (i >= 0) do begin if (Length(SL[i]) = 1) and (SL[i][1] in ['a'..'z', 'A'..'Z']) then begin if not (U in US.s) then begin SL.Delete(i); Dec(Len); end; Inc(U); end; Dec(i); end; // Wörter kürzen i := -1; while (Len > 0) do begin if i < 0 then begin i := SL.Count - 1; Dec(i2); end; if Length(SL[i]) > i2 then begin if not (U in US.s) then begin SL[i] := Copy(SL[i], 1, i2) + Copy(SL[i], i2 + 2); Dec(Len); end; Inc(U); end; Dec(i); end; // nächstes Set, für's Überspringen Inc(US.i); // Text zusammensetzen und ausgeben Result := SL.Text; until Erlaubt(Result); finally SL.Free; end; end; Längere Zahlen werden es ja aktuell noch. |
AW: String intelligent Kürzen
Die gestellte Aufgabe ist definitiv ein Job für eine Klasse.
Damit ist es viel einfacher jede Teilaufgabe in einer eigenen Methode zu lösen. Zudem kann eine Klasse übergreifend benötigte Informationen wie z.B. MaxTotalLen=14, Anzahl der Wörter, die Zahl am Ende einfach in privaten Feldern speichern. Die einzelnen Methoden werden kleiner und leichter zu testen, als wenn man Alles in einer einzigen grossen Funktion verarbeitet. Und überhaupt ist hier das Testen unbedingt nötig. Man braucht also ein Testbett mit dem man mehrere Wertepaare aus Ein- und Ausgangswerten automatisch überprüfen kann. |
AW: String intelligent Kürzen
Der TE war schon mit dem Verständnis meiner Minimallösung überfordert. Imho sollten wir nicht versuchen, eine optimale Lösung zu finden, sondern eine bei der er die Chance hat dise verstehen. In letzter Zeit entsteht aber die Tendenz eine Lösung zu finden, welche den Fragesteller auf jeden Fall überfordert.
|
AW: String intelligent Kürzen
Wie gesagt, bin sehr zufrieden mit der Mischung aus beiden Versionen. Funktioniert 1A und nach einigem grübeln und Studieren habe ich den Code auch verstanden. Also alles bestens. Danke. Habe nun schon hunderte Bezeichnungen auf diese Art gekürzt und es war immer gut. Notfalls könnte ich auch von Hand nach editieren wenn es mal nicht passen sollte.
Zahlen kommen nur selten vor. wenn dann extrem selten höchstens 3 stellig. Wenn überhaupt, dann meist 1-2stellig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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