AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 Zeichenketten zusammenführen

Ein Thema von Bea · begonnen am 29. Nov 2006 · letzter Beitrag vom 30. Nov 2006
Antwort Antwort
Bea

Registriert seit: 23. Dez 2004
53 Beiträge
 
RAD-Studio 2009 Ent
 
#1

2 Zeichenketten zusammenführen

  Alt 29. Nov 2006, 16:29
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
  Mit Zitat antworten Zitat
em-sigma

Registriert seit: 8. Jul 2004
40 Beiträge
 
Delphi 12 Athens
 
#2

Re: 2 Zeichenketten zusammenführen

  Alt 29. Nov 2006, 17:00
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
Allen ist das Denken erlaubt. Vielen bleibt es erspart. (Curt Goetz)
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#3

Re: 2 Zeichenketten zusammenführen

  Alt 29. Nov 2006, 19:16
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: 2 Zeichenketten zusammenführen

  Alt 29. Nov 2006, 19:57
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
  Mit Zitat antworten Zitat
Bea

Registriert seit: 23. Dez 2004
53 Beiträge
 
RAD-Studio 2009 Ent
 
#5

Re: 2 Zeichenketten zusammenführen

  Alt 30. Nov 2006, 08:46
Hallo ihr fleißige Helfer,

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.

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".



Also ich danke euch erst nochmals recht herzlich.

Tschüß bis zum nächsten Problemchen
Bea
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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