Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi An bestimmter Stelle eines Strings einen Wert setzen (https://www.delphipraxis.net/114692-bestimmter-stelle-eines-strings-einen-wert-setzen.html)

Jerry 29. Mai 2008 15:22


An bestimmter Stelle eines Strings einen Wert setzen
 
Hallo zusammen

Ich habe einen String der sieht so aus:

;;;;;;;;;; (also 10 Semikolons)

Wie kann ich nun z.B: an der 5 bis 8 Stelle einen Wert einfüllen?

Also ich möchte am 5. Trennzeichen den Wert 100 setzen:
;;;;100;;;;;

Danach an 6. Stelle den Wert 200:

;;;;100;200;;;;

usw.

Gibt es da schon eine Funktion in Delphi, die das kann?

Vielen Dank für die Hilfe!

Grüsse vom Bodensee (30Grad Celsius) ;-)

Jerry 29. Mai 2008 15:38

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Habe mir jetzt selber geholfen... Habe eine Funktion SetPiece geschrieben:

Vielleicht könnt Ihr diese auch mal gebrauchen...

Delphi-Quellcode:
function SetPiece(S: string; D: Char; i: Integer; ReplaceString: string): string;
var
  Count, Position, EndPosition: Integer;
  Stop: Boolean;
  NewString: string;
begin
  NewString := '';
  Count := 1;
  Stop := (Count >= i);
  while not Stop do
  begin
    Position := Pos(D, S);
    if Position > 0 then
    begin
      NewString := NewString + Copy(S, 1, Position);
      Delete(S, 1, Position)
    end
    else
    begin
      S := '';
      Stop := True;
    end;
    Count := Count + 1;
    if Count = i then
      Stop := True;
  end;

  EndPosition := Pos(D, S);
  if EndPosition = 0 then
    EndPosition := Length(S)
  else
    EndPosition := EndPosition - 1;

  Result := Copy(S, 1, EndPosition);
  Result := NewString + ReplaceString + Copy(S, Length(Result) + 1, Length(S))
end;

tomsel 29. Mai 2008 15:43

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Hättest auch Insert nehmen können. Aber warum einfach ....

Jerry 29. Mai 2008 15:55

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Danke... ;-))

Ich kannte Insert nicht, aber es führt nicht so einfach zum Ergebnis wie meine
Funktion... ;-))

Ich kann meine Funktion z.B so aufrufen:
Mystring :=';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;';
SetPiece(MyString, ';', 20, '100');

und schon habe ich an der 20. Stelle meines Trennzeichen den Wert 100.

Trotzdem vielen Dank.

DeddyH 29. Mai 2008 15:59

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Zitat:

Zitat von Jerry
Ich kannte Insert nicht, aber es führt nicht so einfach zum Ergebnis wie meine
Funktion... ;))

Delphi-Quellcode:
Insert(s,'100',20);
:wiejetzt:

tomsel 29. Mai 2008 16:06

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Ja, klar, haste Recht. Die Position eines bestimmten Trennzeichen muss man natürlich erst ermitteln. Aber dafür bräuchtest du nur eine max. 2-zeilige Schleife, denk ich mal.

tomsel 29. Mai 2008 16:08

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von Jerry
Ich kannte Insert nicht, aber es führt nicht so einfach zum Ergebnis wie meine
Funktion... ;))

Delphi-Quellcode:
Insert(s,'100',20);
:wiejetzt:

Ja, aber wenn man werte eingefügt hat, rutschen die dahinter liegenden Trennzeichen ja weiter nach hinten. Das Trenzeichen Nr 21 liegt in deinem beispiel dann auf Position 24 (?) im String.

tomsel 29. Mai 2008 16:17

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
... was aber nix ausmaacht, wenn man von hinten beginnt, die Werte einzufügen. Man könnte die Werte aber auch erst ganz am Ende der Verarbeitung zu einem CSV-String zusammensetzen, dann erübrigt sich das Einfügen.

marabu 29. Mai 2008 17:42

Re: An bestimmter Stelle eines Strings einen Wert setzen
 
Hallo Jerry,

wenn deine Strings CSV-konform sind, dann funktioniert auch sowas:

Delphi-Quellcode:
function SetValue(const aLine, aValue: string; aIndex: Cardinal;
    aDelimiter: Char = ','; aQuoteChar: Char = '"'): string;
begin
  with TStringList.Create do
  try
    Delimiter := aDelimiter;
    QuoteChar := aQuoteChar;
    DelimitedText := aLine;
    if aIndex = Count
      then Add(aValue)
      else Strings[aIndex] := aValue;
    Result := DelimitedText;
  finally
    Free;
  end;
end;
Grüße vom marabu

Nachtrag: Sonderbehandlung für letzten Value eingeführt, zu große Indexwerte werfen eine Exception.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 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