AGB  ·  Datenschutz  ·  Impressum  







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

CSV anpassen

Ein Thema von julchen · begonnen am 15. Jan 2021 · letzter Beitrag vom 26. Jan 2021
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.646 Beiträge
 
Delphi 12 Athens
 
#1

AW: CSV anpassen

  Alt 18. Jan 2021, 11:02
.. wie schonmal angemerk, würde ich die Titel zusammenfassem.
Würde ich auch machen. Hier mal eine rudimentäre Funktion dafür:
Delphi-Quellcode:
function MakeCSV(Line: string): string;
var
  lst: TStringList;
  M: Integer;
  N: Integer;
begin
  lst := TStringList.Create;
  try
    { Anrede }
    N := Line.IndexOf(' ');
    lst.Add(Line.Substring(0, N));
    Line := Line.Remove(0, N + 1);
    { Titel }
    N := Line.LastIndexOf('.');
    if N > 0 then begin
      { Punkt mitnehmen }
      lst.Add(Line.Substring(0, N + 1));
      Line := Line.Remove(0, N + 2);
    end
    else begin
      { kein Titel }
      lst.Add('');
    end;
    { gibt es einen Vornamen? }
    N := Line.IndexOf(',');
    if N > 0 then begin
      { Nachname }
      lst.Add(Line.Substring(0, N));
      { Komma und Leerzeichen mit entfernen }
      Line := Line.Remove(0, N + 2);
      { Vorname }
      N := Line.IndexOf(' ');
      lst.Add(Line.Substring(0, N));
      Line := Line.Remove(0, N + 1);
    end
    else begin
      { Nachname }
      N := Line.IndexOf(' ');
      lst.Add(Line.Substring(0, N));
      Line := Line.Remove(0, N + 1);
      { kein Vorname }
      lst.Add('');
    end;
    { "mit" }
    lst.Add(Line);

    Result := lst.CommaText;
  finally
    lst.Free;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: CSV anpassen

  Alt 18. Jan 2021, 19:55
Hallo,

vielen Dank für eure Hilfe und die tollen Codebeispiele.
Hätte ich nieeeeee geschafft.
Mit dem Titel habe ich mir überlegt, das ein Eintrag für alle Titel reicht.
Werde Morgen mit dem Code weiterarbeiten. Melde mich dann wieder.
Bis dahin und ich noch einen schönen Abend euch allen.
VG Julia
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.174 Beiträge
 
Delphi 12 Athens
 
#3

AW: CSV anpassen

  Alt 19. Jan 2021, 08:06
Hätte ich nieeeeee geschafft.
Dooooch, sicher.
Übung mach die Meisterin
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#4

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
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: CSV anpassen

  Alt 22. Jan 2021, 19:00
Hallo,

meine Beispieltexte haben noch eine zweite Hälfte, die für mich bis her nicht das Problem waren, da es fest definierte Zeichen gibt, die ich mit StringReplace gegen ein Semikolon tauschen konnte.
Mit eurem Code laufen die Texte auseinander.

Aus:
Herr Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Herr Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Herr Dr. Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Herr Dr. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Herr Prof. Dr. Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Herr Prof. Dr. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)

Wird:
Herr;;Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00;;Uhr)
Herr;;Mustermann;Max mit ABCDEFGHI/00A (1): Terminplan(08:00;Uhr)
Herr;Dr.;Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00;Max mit ABCDEFGHI/00A (1): Terminplan(08:00;Uhr)
Herr;Dr.;Mustermann;Max mit ABCDEFGHI/00A (1): Terminplan(08:00;Uhr)
Herr;Prof. Dr.;Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00;Max mit ABCDEFGHI/00A (1): Terminplan(08:00;Uhr)
Herr;Prof. Dr.;Mustermann;Max mit ABCDEFGHI/00A (1): Terminplan(08:00;Uhr)

Ich habe mit den Codes so ein bisschen rumgespielt und auch versucht, die Variante von Blup an mein Problem anzupassen und zu erweitern, da es die für mich einfachste Variante war, die ich verstehen konnte.

Das Problem ist wohl wirklich, den Vornamen zu fassen
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.646 Beiträge
 
Delphi 12 Athens
 
#6

AW: CSV anpassen

  Alt 22. Jan 2021, 19:37
Ich denke, mein obiges Codebeispiel kommt mit den Texten ganz gut klar.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#7

AW: CSV anpassen

  Alt 23. Jan 2021, 10:08
Ohne jemanden entmutigen zu wollen (und ich kenn ja auch die Qualität der zu untersuchenden Daten nicht), aber spätestens wenn Sätze wie

Herr Dr. Mustermann, K. mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Herr von Mustermann, Klaus W. mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)

auftauchen, wird klar, dass die hier vorgestellten Lösungen nicht funktionieren.

Die Logik zur Ermittlung des Vornamens ist doch relativ simpel:
Ist das aktuelle Wort nicht 'mit' und der Familienname ist bereits identifiziert, dann ist das Wort der Vorname.
  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 23:16 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