Thema: Delphi CSV anpassen

Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#26

AW: CSV anpassen

  Alt 20. Jan 2021, 10:12
@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;
  Mit Zitat antworten Zitat