![]() |
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 |
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 |
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:
Gruß
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. Mazel |
Re: 2 Zeichenketten zusammenführen
Hallo,
auch wenn die Anforderungen nicht ausreichend klar sind - hier noch eine kleine Inspiration:
Delphi-Quellcode:
Angenommen Zeichenkette 2 steht in einem Memo zur Verfügung und Zeichenkette 1 in einem Edit, dann erhältst du dein Ergebnis so:
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;
Delphi-Quellcode:
Freundliche Grüße
procedure TDemoForm.TestButtonClick(Sender: TObject);
begin ShowMessage(BeaStr(Memo.Lines, Edit.Text)); end; |
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 05: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