Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2 Zeichenketten zusammenführen (https://www.delphipraxis.net/81571-2-zeichenketten-zusammenfuehren.html)

Bea 29. Nov 2006 15:29


2 Zeichenketten zusammenführen
 
Hallo,
ich habe folgendes Problem.
Ich habe 2 verschiedene Zeichenketten, die ich zusammenführen möchte:

Zeichenkette1:
"Hallo,Welt",29.11.2006,67,"Max Mustermann",12345

Zeichenkette2:
1
2
3
4
5
6

als Ergebnis soll folgende Zeichenkette entstehen:
1,Hallo\,Welt,2,29.11.2006,3,67,4,Max Mustermann,5,12345

Trennzeichen zwischen den einzelnen Teilen der Zeichenkette sind Kommas.
Text steht in Anführungszeichen und kann aber auch nochmal Kommas enthalten, die natürlich keine Trennzeichen darstellen
(diese müssen für die spätere Weiterverarbeitung durch ein vorangestellten Backslash gekennzeichnet werden!).
Wie kann man denn soetwas elegant lösen?
Kann mir da bitte jemand helfen?

Danke im Vorraus
Bea

em-sigma 29. Nov 2006 16:00

Re: 2 Zeichenketten zusammenführen
 
Moin Bea,

zum Zerlegen von Zeichenketten gibt's hier im Forum doch irgendwo eine Funktion namens "Explode" (hab ich jedenfalls mal gesehen, mußt Du mal nach suchen).

Die zerlegt dir dann den String in seine Teile, immer da, wo das Trennzeichen auftaucht. Natürlich auch dann, wenn das Trennzeichen innerhalb von Anführungszeichen steht.

Diesen Fall muß du dann gesondert behandeln. Ist aber nicht so schlimm. Der Fall ist leicht daran zu erkennen, daß das abschließende Anführungszeichen fehlt. Deshalb fügst du alle folgenden Strings wieder hinten an (mit einem "\," dazwischen) bis ein String mit einem Anführungszeichen als letztem Character auftaucht.

War das verständlich?

Viel Spaß,
em-sigma

Mazel 29. Nov 2006 18:16

Re: 2 Zeichenketten zusammenführen
 
Hi,

ich habe hier mal ein Code gebastelt, der allerdings nur funktioniert, wenn die Zeichekette 2 so ist wie ist vorgestellt wurde, hoffe du kannst damit etwas anfangen:
Delphi-Quellcode:
  private
    // setzt nunächst ein Backslash für ein Komma in einem Text
    function SetSeparatorInText(Zeichenkette: String): String;
    // setzt am Ende der Prozedur nach dem Backslash ein Komma in einem Text
    function SetCommaAfterSeparator(Zeichenkette: String): String;
    // fügt die einzelnen Strings zusammen
    function JoinStrings(Zeichenkette: String): String;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
.
.
.

function TForm1.SetSeparatorInText(Zeichenkette: String): String;
var
 i: Integer;
 InText: Boolean;      // Booleanwert für Aussage ob in einem Text oder nicht

begin
 Result := '';
 InText := False;
 for i := 1 to Length(Zeichenkette) do
  begin
   If (Zeichenkette[i] = '"') and (not InText) then InText := True
   Else If (Zeichenkette[i] = '"') and (InText) then InText := False;
   If InText then
    begin
     If Zeichenkette[i] = ',' then
      begin
       Delete(Zeichenkette, i, 1);
       Insert('\', Zeichenkette, i);
      end;
    end;
  end;
 Result := Zeichenkette;
end;

function TForm1.SetCommaAfterSeparator(Zeichenkette: String): String;
var
 i: Integer;

begin
 Result := '';
 for i := 1 to Length(Zeichenkette) do If Zeichenkette[i] = '\' then Insert(',', Zeichenkette, i + 1);
 Result := Zeichenkette;
end;

// diese Funktion muss gegebenfalls angepasst werden
function TForm1.JoinStrings(Zeichenkette: String): String;
var
 i: Integer;
 j: Integer;
 Teile: array[0..4] of String;   //hier werden die Einzelteile gespeichert

begin
 Result := '';
 j := 0;
 Repeat
  Teile[j] := Copy(Zeichenkette, 1, Pos(',', Zeichenkette));
  Delete(Zeichenkette, 1, Pos(',', Zeichenkette));
  Inc(j);
 Until Pos(',', Zeichenkette) = 0;
 Teile[4] := Copy(Zeichenkette, 1, Length(Zeichenkette));
 Zeichenkette := '';
 for i := 1 to 5 do
  begin
   Zeichenkette := Zeichenkette + Label2.Caption[i] + ',' + Teile[i - 1];
  end;
 Result := Zeichenkette;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Tmp: String;

begin
 Tmp := Label1.Caption;
 Tmp := SetSeparatorInText(Tmp);
 Tmp := JoinStrings(Tmp);
 Label3.Caption := SetCommaAfterSeparator(Tmp);
 // Kurzschreibeweise sieht wiefolgt aus
 //Label3.Caption := SetCommaAfterSeparator(JoinStrings(SetSeparatorInText(Label1.Caption)));
end;

end.
Gruß
Mazel

marabu 29. Nov 2006 18:57

Re: 2 Zeichenketten zusammenführen
 
Hallo,

auch wenn die Anforderungen nicht ausreichend klar sind - hier noch eine kleine Inspiration:

Delphi-Quellcode:
function BeaStr(lines: TStrings; const csv: String): String;
var
  i: Integer;
begin
  with TStringList.Create do
  try
    CommaText := csv;
    Text := StringReplace(Text, ',', '\,', [rfReplaceAll]);
    lines.Text := StringReplace(lines.Text, ',', '\,', [rfReplaceAll]);
    for i := 0 to Pred(lines.Count) do
      if i < Count - i
        then Insert(i shl 1, lines[i])
        else Break;
    QuoteChar := #255;
    Delimiter := ',';
    Result := StringReplace(DelimitedText, #255, '', [rfReplaceAll]);
  finally
    Free;
  end;
end;
Angenommen Zeichenkette 2 steht in einem Memo zur Verfügung und Zeichenkette 1 in einem Edit, dann erhältst du dein Ergebnis so:

Delphi-Quellcode:
procedure TDemoForm.TestButtonClick(Sender: TObject);
begin
  ShowMessage(BeaStr(Memo.Lines, Edit.Text));
end;
Freundliche Grüße

Bea 30. Nov 2006 07:46

Re: 2 Zeichenketten zusammenführen
 
Hallo ihr fleißige Helfer, :hello:

also das ist ja immer total prima, wie schnell man hier professionelle Hilfe bekommt.
Dafür erstmal meinen Dank, ich finde das jedesmal wieder echt Spitze. :spin2:

Ich habe beide Varianten von Mazel und von marabu probiert und das klappte beides sofort prima.
Nun werde ich mich mal durch die Details forsten,
will ja bei der ganzen Sache auch was lernen und nicht einfach nur "Quelltext übernehmen-Danke-fertig".

:roteyes:

Also ich danke euch erst nochmals recht herzlich.

Tschüß bis zum nächsten Problemchen
Bea :hi:


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