AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CSV anpassen

Ein Thema von julchen · begonnen am 15. Jan 2021 · letzter Beitrag vom 26. Jan 2021
Antwort Antwort
Seite 3 von 5     123 45   
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
516 Beiträge
 
FreePascal / Lazarus
 
#21

AW: CSV anpassen

  Alt 18. Jan 2021, 08:46
Wie Klaus bereits hier schrieb: https://www.delphipraxis.net/1481022-post3.html
Wäre es am Besten, eine klare Struktur als CSV zu haben.
Wobei ich immer die Variante mit "" bevorzuge, dann wäre das bei dir:
"Anrede";"Titel";"Nachname";"Vorname";"mit" //wozu das "mit" auch immer steht

Diese kann man dann (zumindest in Lazarus) mittels bereits existierender Funktion in ein Grid laden: Grid.LoadFromCSVFile('Dateiname') Dies kannst du dann entsprechend viel leichter behandeln und die Fehlerquote ist geringer.

Oben bitte mal ignorieren, ich denke du willst aus deinen Daten eine richtige CSV machen, diese also "korrigieren".

Woher kommt denn deine Text/CSV-Datei? Musst du sie wirklich selber anpassen oder wäre es nicht ggf. Sinnvoller die Quelle anzupassen (wenn möglich).
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (18. Jan 2021 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.691 Beiträge
 
Delphi 6 Enterprise
 
#22

AW: CSV anpassen

  Alt 18. Jan 2021, 10:12
Könnte man das nicht irgendwie OOP sauber lösen, anstatt so eine Stringlist Orgie?

Man erstellt ein Objekt für eine Person mit den Benötigten Feldern, übergibt dann den jetzigen langen String für eine Person an das Objekt. Darin wird der String zerlegt und auf die Felder verteilt. Dann kriegt das Objekt noch eine ToCSVString Funktion oder so, die das in der richtigen Reihenfolge mit Semikolon getrennt raus gibt.

Bei der Zerlegung des String bleiben natürlich trotzdem die bisher genannten Probleme zu Unterscheiden, was was ist.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.383 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: CSV anpassen

  Alt 18. Jan 2021, 12: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
113 Beiträge
 
Delphi 10.3 Rio
 
#24

AW: CSV anpassen

  Alt 18. Jan 2021, 20: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
3.119 Beiträge
 
Delphi 10.4 Sydney
 
#25

AW: CSV anpassen

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

Registriert seit: 7. Aug 2008
1.288 Beiträge
 
Delphi 2007 Professional
 
#26

AW: CSV anpassen

  Alt 20. Jan 2021, 11: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
113 Beiträge
 
Delphi 10.3 Rio
 
#27

AW: CSV anpassen

  Alt 22. Jan 2021, 20: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
8.383 Beiträge
 
Delphi 10.4 Sydney
 
#28

AW: CSV anpassen

  Alt 22. Jan 2021, 20: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
85 Beiträge
 
#29

AW: CSV anpassen

  Alt 23. Jan 2021, 11: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
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.383 Beiträge
 
Delphi 10.4 Sydney
 
#30

AW: CSV anpassen

  Alt 23. Jan 2021, 12:54
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.
Wenn keine vollständigen Regeln definiert sind, kann man halt nur eine Analyse der verfügbaren Daten vornehmen und passende Regeln daraus ableiten. Sobald dann aber Daten auftauchen, für die diese Regeln nicht gelten, muss man halt nochmal ran. Das ist dann halt nicht zu vermeiden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 01:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf