![]() |
String zerlegen
Hi Delphianer
Ich weiß ich bin lästig, aber ich bin erst seit kurzem dabei mich mit delphi zu beschäftigen ... :) ich habe einen String der so aussieht: zB 20100917 das ganze muss ich in 3 Teile stückeln (Tag, Monat, Jahr) mit LeftStr und Right Str bekomme ich ja wunderschön das Jahr und den Tag ich weiß aber nicht wie ich das Monat bekomme... Könnt ihr mir da helfen? DANKE im voraus! |
AW: String zerlegen
Wenn der String immer gleich aussieht, schau dir mal die Funktion Copy an. Damit kann man etwas aus der String-Mitte schneiden
|
AW: String zerlegen
z.b
a := copy('zb 20101218', 0, Pos(' ', 'zb 20101218') -1); y := copy('zb 20101218', Pos(' ', 'zb 20101218') +1, 4); a would be = 'zb'; y would be = '2010'; etc. |
AW: String zerlegen
Wenn der String immer identisch aufgebaut ist, kann Du auch folgenden Code verwenden:
Delphi-Quellcode:
etwas eleganter:
a := Copy('20101218', 0, 4);
b := Copy('20101218', 4, 4); c := Copy('20101218', 8, 2);
Delphi-Quellcode:
sString := '20101218';
a := Copy(sString, 0, 4); b := Copy(sString, 4, 4); c := Copy(sString, 8, 2); |
AW: String zerlegen
Wobei COPY nicht 0 sondern 1 basiert ist....
|
AW: String zerlegen
Euch sollte schon klar sein das "zb" "zum Beispiel" bedeutet.
Der String ist 20100917 Ansonsten würde ja wohl die Funktion LeftStr nicht das Jahr liefern. |
AW: String zerlegen
Zitat:
|
AW: String zerlegen
Zitat:
|
AW: String zerlegen
Nicht Quatsch: Copy geht ab 1 los (genau wie Pos)
|
AW: String zerlegen
Zitat:
Delphi-Quellcode:
als Ergebnis 'a'?
Copy('abcd', 0, 1)
|
AW: String zerlegen
Zitat:
![]() |
AW: String zerlegen
Delphi-Quellcode:
Kopiere ab Zeichen x Zeichen
datum:=20100917
jahr:=copy(datum,1,4)); monat:=copy(datum,5,2)); tag:=copy(datum(7,2)); |
AW: String zerlegen
Zitat:
|
AW: String zerlegen
Zitat:
Wir kommen vom Thema ab :wink: |
AW: String zerlegen
Zitat:
Na auf jeden Fall dürfte er nicht mehr übersehen, das Copy eine ganz interessante Funktion für die Aufgabe ist ;) |
AW: String zerlegen
Zitat:
So, und jetzt bitte Back2Topic |
AW: String zerlegen
ist zwar blöd hier rumzudiskutieren aber was liefert bei Dir:
Copy('abcd', 2, 1) |
AW: String zerlegen
Zitat:
|
AW: String zerlegen
eben...... und Schluß mit dem Quatsch von 0 basiert
|
AW: String zerlegen
Hab' mich selber erst vor zwei Tagen bei den Copy-Parametern verhauen, kann ja mal passieren.
Richtig ist aber auch, das ein OutOfRange-Error die bessere Lösung wäre. _LStrCopy korrigiert aber leider den Index auf die Grenzen des String ohne Fehler zu melden. Aber auch richtig ist, das es doch etwas Off-Topic wird ;) |
AW: String zerlegen
Es passiert doch nichts, wenn copy fehlertolerant ist.
|
AW: String zerlegen
Stimmt eigentlich schon...
...man übersieht so halt manchmal leicht einen Fehler, weil es richtig aussieht und beim Debuggen woanders gesucht wird. |
AW: String zerlegen
[sehr OT]
Eigentlich sollten auch sämtliche Listen immer von 1 an gezählt werden. Zumindest würde das wohl jeder Programmieranfänger erwarten und als logisch ansehen. Und man könnte Schleifen von "0 to Count - 1" einfacher als "1 to Count" schreiben. Logischer wäre das allemal. Also würde ich die Vorwürfe :wink: nicht Copy und Pos machen, sondern vielmehr als Vorreiter der guten Sache bezeichnen :-D. [/sehr OT] |
AW: String zerlegen
[sehr OT]
Da aber intern Basisadresse + Index * Elementbreite zum Berechner der Addresse verwendet wird, wird oft bei einem Index von 0 gestartet. [/sehr OT] |
AW: String zerlegen
Delphi-Quellcode:
so funktionierts perfekt :)
a := Copy(tmp_date, 0, 4);
b := Copy(tmp_date, 5, 2); c := Copy(tmp_date, 7, 2); DANKE |
AW: String zerlegen
Wie schon gesagt
Delphi-Quellcode:
muss eigentlich
a := Copy(tmp_date, 0, 4);
Delphi-Quellcode:
heissen
a := Copy(tmp_date, 1, 4);
|
AW: String zerlegen
das funktioniert prima, ich stehe allerdings schon wieder vor einer
neuen herausforderung... ich habe jetzt nämlich diesen string: 2010\10\07\vctrkdielskdoivüqöökd.wav um genau zu sein habe ich einige die so aufgebaut sind: 2010\10\07\vctrkdielskdoivüqöökd.wav 2010\10\07\vctrkdkkdow9322qöökd.wav 2010\10\07\vctrkkk3ß2kclsß2kc04.wav usw usw.... das heisst mit pos usw komme ich hier nicht weiter oder? gibt es die möglichkeit, das ich delphi sage, schreibe mir alles AB dem 3. Backslash in eine variable? Danke schon mal LG |
AW: String zerlegen
Zitat:
|
AW: String zerlegen
Hi,
und was würde dir das bringen? Oder ist dein Ziel jetzt nicht mehr Tag Monat und Jahr zu bekommen? Mögiche Lösung wäre über AnsireplaceStr
Delphi-Quellcode:
Grußtmp_date := Ansireplacestr(tmp_date, '\', ''); a := Copy(tmp_date, 1, 4); b := Copy(tmp_date, 5, 2); c := Copy(tmp_date, 7, 2); |
AW: String zerlegen
Dafür gibt es
![]()
Delphi-Quellcode:
Da steht dann nachher in i die Position wo das "\" steht. Und dann mit
var
i : Integer; begin i := 1; while (i <= Length(S)) and (S[i] <> '\') do Inc(i); ![]()
Delphi-Quellcode:
Beides ungetestet.
NewS := Copy(S, i + 1, Length(S) - i);
Übrigens RegEx wären hier etwas overkill oder? MfG Fabian |
AW: String zerlegen
Hallo,
Zitat:
![]() Gruß Hawkeye |
AW: String zerlegen
@hawkeye erschließt sich mir zwar nicht, weil er dann alles bekommt außer den Zahlen
Es gibt keine Allerweltsmethode um aus irgendwas das Datum zu ermitteln. Man braucht immer die Information, wie das Datum aufgebaut ist, sonst rummst es.
Code:
Kann ja nun bedeuten 20.10.2011 oder auch 20.11.2010
20102011
Um nun eine Funktion zu basteln, die aus einem beliebigen Text das Datum ermittelt, würde ich der Funktion den Text und das Muster mitgeben
Delphi-Quellcode:
Edit:
GetDateTime( '20102011', 'JJJJTTMM' )
GetDateTime( '2010\10\07\vctrkdielskdoivüqöökd.wav', 'JJJJ?MM?TT*' ) Ok, beim nächsten Mal lese ich auch was er wirklich will :mrgreen: Also vergessen wir mal meinen Beitrag ;) |
AW: String zerlegen
extract file name passt wie die faust aufs aug :)
DANKE |
AW: String zerlegen
copy geht mit 0 und mit 1, Pos begint mit 1, und string index begint mit 1
copy(a, 0, 1) copy(a, 1, 1) ist das selbe denke ich Pos('s', 'string') > 0 wobei s als 1 idendifiziert wird und s[0] <- fehler s[1] <- richting PS: you are right about zb, but I just thought I would use it as an example :) |
AW: String zerlegen
Zitat:
![]() oder Im Forum gibt es zusätzlich eine Routine ![]() |
AW: String zerlegen
Oder einfach per StringListe
|
AW: String zerlegen
Danke für die vielen Hilfen, Hab es jetzt etwas anders, aber einfacher gelöst und es geht endlich... trotzdem DANKE!
Delphi-Quellcode:
procedure Tfmuanzeigen.darstellen;
var x1,x2,y1,t:integer; s,s1,s2,s3:string; begin qbefehl.Close; qbefehl.SQL.Clear; qbefehl.SQL.Add('select ma.mid,urlaub.beginn,rtrim(urlaub.dauer),urlaub.unr from ma '+ 'inner join urlaub on ma.mid = urlaub.mid '+ 'where ma.aid = '+quotedstr(dbcbabteilung.KeyValue)+' order by ma.mid asc'); qbefehl.Open; qanzahl.Close; qanzahl.SQL.Clear; qanzahl.SQL.Add('select count(Urlaub.UNr) as anzahl from Urlaub '+ 'inner join ma on Urlaub.MId = ma.MId '+ 'where AId = '+quotedstr(dbcbabteilung.KeyValue)); qanzahl.Open; qbefehl.first; while not qbefehl.eof do begin S:=qbefehl.Fields.Fields[1].AsString; //Datum t:=qbefehl.fields.fields[2].asinteger;//Dauer s1 := Copy(s, 0, 2); s2 := Copy(s, 4, 2); s3 := Copy(s, 7, 4); x1:=strtoint(s1); x2:=strtoint(s1); if s2 = cbmonat.Text then begin for x1:=strtoint(s1) to x1+t-1 do begin y1:=qbefehl.fields.fields[0].asinteger; sg.Cells[x2,y1]:='XXXXXXXX'; inc(x2); end; end; qbefehl.next; end; end; |
AW: String zerlegen
Das ist schonmal nicht schlecht, aber ich würde die folgenden Teile so machen : (ungetestet)
Delphi-Quellcode:
qbefehl.Close;
qbefehl.SQL.Clear; qbefehl.SQL.Add('select ma.mid,urlaub.beginn,rtrim(urlaub.dauer),urlaub.unr from ma '+ 'inner join urlaub on ma.mid = urlaub.mid '+ 'where ma.aid = :maaid order by ma.mid asc'); qbefehl.parambyname('maaid').AsString := dbcbabteilung.KeyValue; qbefehl.Open; qanzahl.Close; qanzahl.SQL.Clear; qanzahl.SQL.Add('select count(Urlaub.UNr) as anzahl from Urlaub '+ 'inner join ma on Urlaub.MId = ma.MId '+ 'where AId = :aid'); qbefehl.parambyname('aid').AsString := dbcbabteilung.KeyValue; qanzahl.Open; qbefehl.first;
Delphi-Quellcode:
Diese Zeile ersetzt die drei Copy-Befehle.
DecodeDate(StrToDateTime(qbefehl.Fields.Fields[1].AsString), s3, s2, s1);
|
AW: String zerlegen
Hallo,
Delphi-Quellcode:
Macht wenig Sinn, da s1,s2,s3 Strings sind, aber dass lässt sich ja ändern.
DecodeDate(StrToDateTime(qbefehl.Fields.Fields[1].AsString), s3, s2, s1);
Muss man dann aber nicht aufpassen, ob dass richtige Format StrtoDateTime bei ...AsString herauskommt. Wenn Fields[1] vom Typ ein Datum ist, kann man es sicher direkt mit AsDate umformen.Zudem muss man vielleicht noch beachten, das der Urlaub auch über das Monatsende/Jahr hinausgehen kann. Was macht man, wenn der Urlaub/Elternzeit im Vormonat/ Vorjahr beginnt?? Vielleicht wäre es angebrachter, statt der Dauer das Enddatum zu speichern.
Delphi-Quellcode:
suchMonat := StrToInt(cbmonat.Text);
while not qbefehl.eof do begin StartDatum := qbefehl.Fields.Fields[1].AsDate;// TDateTime; DecodeDate(StartDatum, wJahr, wMonat,wTag); if wMonat = suchMonat then begin y1:=qbefehl.fields.fields[0].asinteger;// passende Spalte t :=qbefehl.fields.fields[2].asinteger;// Dauer in Tagen t := t+wTag; IF t > DaysInMonth(StartDatum) then t := DaysInMonth(StartDatum); DaysInMonth(Now) for i:= wTag to t do sg.Cells[i,y1]:='XXXXXXXX'; end; qbefehl.next; end; |
AW: String zerlegen
@Horst_
Ob EndDatum oder Dauer ist völlig egal, da sich das EndDatum oder die Dauer immer aus dem StartDatum berechnen lässt (je nachdem, was man hat). Die Dauer zu speichern hat allerdings den Vorteil, dass bei einer Verschiebung nur das StartDatum geändert werden muss, und bei einer Änderung der Dauer eben halt nur dieser eine Wert ;) Das reine iterieren über die Tage ist allerdings auch suboptimal. Ich würde immer über das Datum iterieren |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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 by Thomas Breitkreuz