@Jumpy
OOP bedeuted nicht, das alle Methoden die irgendetwas mit dem Datenobjekt zu tun haben, auch im Datenobjekt implementiert werden.
Methoden für den Export oder Import gehören dann eher in eine Klasse die das entsprechende Dateiformat representiert.
Da es sich hier um zwei verschiedene Formate handelt, würde ich den Export und Import zumindest in zwei Methoden aufteilen.
Das erhöht vieleicht auch die Lesbarkeit.
Als Trennzeichen soll das Semikolon genutz werden.
Ich habe den Code von Uwe Raabe ein bischen abgewandelt
https://www.delphipraxis.net/1481113-post23.html
Delphi-Quellcode:
type
TMyData = record
Anrede: string;
Titel: string;
Nachname: string;
Vorname: string;
mit: string;
end;
function TextToMyData(ALine: string): TMyData;
var
N: Integer;
begin
{ "Anrede" immer vorhanden }
N := ALine.IndexOf(' ');
Result.Anrede := ALine.Substring(0, N);
ALine := ALine.Remove(0, N + 1);
{ "Titel" ein oder mehrere optional }
N := ALine.LastIndexOf('.');
if N > 0 then
begin
{ Punkt mitnehmen }
Result.Titel := ALine.Substring(0, N + 1);
ALine := ALine.Remove(0, N + 2);
end;
{ "mit" immer vorhanden }
N := ALine.LastIndexOf(' ');
if N > 0 then
begin
Result.mit := ALine.Substring(N + 1);
ALine := ALine.Remove(N);
end;
{ "Vorname" optional }
N := ALine.IndexOf(',');
if N > 0 then
begin
Result.Vorname := ALine.Substring(N + 1);
Result.Vorname := Result.Vorname.Trim;
ALine := ALine.Remove(N);
end;
{ "Nachname" immer vorhanden }
Result.Nachname := ALine.Trim;
end;
function MyDataToCSV(const AValue: TMyData): string;
var
lst: TStringList;
begin
lst := TStringList.Create;
try
lst.QuoteChar := '"';
lst.Delimiter := ';';
lst.StrictDelimiter := True;
{ Anrede;Titel;Nachname;Vorname;mit }
lst.Add(AValue.Anrede);
lst.Add(AValue.Titel);
lst.Add(AValue.Nachname);
lst.Add(AValue.Vorname);
lst.Add(AValue.mit);
Result := lst.DelimitedText;
finally
lst.Free;
end;
end;
procedure TForm1.TestClick(Sender: TObject);
var
i: Integer;
s: string;
v: TMyData;
begin
Memo2.Lines.Clear;
for i := 0 to Memo1.Lines.Count - 1 do
begin
s := Memo1.Lines[i];
{ leere Zeilen ignorieren (Textdateien enthalten als letztes Zeichen häufig noch einen Zeilenumbruch) }
if s.Length > 0 then
begin
v := TextToMyData(s);
s := MyDataToCSV(v);
Memo2.Lines.Add(s);
end;
end;
end;