Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CSV anpassen (https://www.delphipraxis.net/206659-csv-anpassen.html)

Delphi.Narium 23. Jan 2021 15:37

AW: CSV anpassen
 
Just for fun mal ein Pascalscript zum Thema:
Delphi-Quellcode:
program JustForFun;
var
  i        : Integer;
  sl       : TStringList;
  sAnrede  : String;
  sTitel   : String;
  sNachname : String;
  sVorname : String;
  sABCD    : String;
  sTermin  : String;
  iPos     : Integer;
  sTemp    : String;
begin
  sl := TStringList.Create;
  // Statt eine Datei zu lesen
  // sl.LoadFromFile('c:\temp\wie.auch.immer.txt');
  sl.Add('Herr Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Dr. Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Dr. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Prof. Dr. Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Prof. Dr. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Prof. Dr. rer. nat. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Prof. Dr. Dipl.-Ing. Hummel, Johann-Nepomuk mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Frau Dr. Wespe, Natalie mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Frau Dr. med. Müller-Lüdenscheid, Cleopatra mit Julius Cäsar/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr van Gogh, Vincent Willem mit Gustav Klimt/00A (1): Terminplan(08:00 Uhr)');
  sl.Add('Herr Wells, H. G. mit Böll, Heinrich/00A (1): Terminplan(08:00 Uhr)');
  for i := 0 to sl.Count - 1 do begin
    sTemp  := Trim(sl[i]);
    // Falls mal jemand 'ne Leerzeile einschmuggelt:
    if sTemp = '' then continue;
    WriteLn('Quelle: ' + sl[i]); // Ausgabe nur zum Testen
    // Zuerst den Termin holen:
    iPos   := Pos('Terminplan',sTemp);
    sTermin := Copy(sl[i],iPos,Length(sTemp));
    // Den Termin entfernen.
    sTemp  := Copy(sTemp,1,iPos - 3);
    // Position von " mit " ermitteln
    iPos   := Pos(' mit ',sTemp);
    // und alles hinter " mit " holen.
    sABCD  := Copy(sTemp,iPos + 5,Length(sTemp));
    // Alles, einschließlich " mit " entfernen.
    sTemp  := Copy(sTemp,1,iPos - 1);
    // Gibt es ein Komma, dann gibt es auch einen Vornamen.
    iPos    := Pos(', ',sTemp);
    sVorname := '';
    if iPos > 0 then begin
      sVorname := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      sTemp   := Copy(sTemp,1,iPos - 1);
    end;
    // Erstes Leerzeichen suchen, davor steht die Anrede.
    iPos   := Pos(' ',sTemp);
    sAnrede := Copy(sTemp,1,iPos - 1);
    // Anrede entfernen.
    sTemp  := Copy(sTemp,iPos + 1,Length(sTemp));
    // Haben wir 'nen Punkt, so haben wir auch 'nen Titel:
    sTitel := '';
    iPos := Pos('. ',sTemp);
    while iPos > 0 do begin
      sTitel := Format('%s %s',[sTitel,Copy(sTemp,1,iPos)]);
      sTemp := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      iPos  := Pos('. ',sTemp);
    end;
    sTitel   := Trim(sTitel);
    // Der verbliebene Rest entspricht dem Nachnamen:
    sNachname := sTemp;
    sl[i]    := Format('%s;%s;%s;%s;mit %s: %s', [sAnrede, sTitel, sNachname, sVorname, sABCD, sTermin]);
    WriteLn('CSV  : ' + sl[i]); // Ausgabe nur zum Testen
  end;
  // sl.SaveToFile('c:\temp\wie.auch.immer.csv');
  sl.Free;
end.
Die Ausgabe dazu:
Code:
Quelle: Herr Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;;Mustermann;;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;;Mustermann;Max;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Dr. Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;Dr.;Mustermann;;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Dr. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;Dr.;Mustermann;Max;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Prof. Dr. Mustermann mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;Prof. Dr.;Mustermann;;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Prof. Dr. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;Prof. Dr.;Mustermann;Max;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Prof. Dr. rer. nat. Mustermann, Max mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;Prof. Dr. rer. nat.;Mustermann;Max;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Prof. Dr. Dipl.-Ing. Hummel, Johann-Nepomuk mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;Prof. Dr. Dipl.-Ing.;Hummel;Johann-Nepomuk;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Frau Dr. Wespe, Natalie mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
CSV  : Frau;Dr.;Wespe;Natalie;mit ABCDEFGHI/00A (1): Terminplan(08:00 Uhr)
Quelle: Frau Dr. med. Müller-Lüdenscheid, Cleopatra mit Julius Cäsar/00A (1): Terminplan(08:00 Uhr)
CSV  : Frau;Dr. med.;Müller-Lüdenscheid;Cleopatra;mit Julius Cäsar/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr van Gogh, Vincent Willem mit Gustav Klimt/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;;van Gogh;Vincent Willem;mit Gustav Klimt/00A (1): Terminplan(08:00 Uhr)
Quelle: Herr Wells, H. G. mit Böll, Heinrich/00A (1): Terminplan(08:00 Uhr)
CSV  : Herr;;Wells;H. G.;mit Böll, Heinrich/00A (1): Terminplan(08:00 Uhr)

julchen 24. Jan 2021 15:48

AW: CSV anpassen
 
Hallo,

warum funktioniert dein Code nicht?
Was mache ich da falsch?
Code:
// === laden ==============================================
procedure TForm1.Button1Click(Sender: TObject);
var str: TStringlist;
begin
     str := Tstringlist.Create;
     try
     str.LoadFromFile('c:\users\Julia\documents\stringlist.txt');
     Memo1.Lines.AddStrings(str);
     finally
     str.Free;
     end;
end;



// === verarbeitung ==============================================
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
  sl : TStringList;
  sAnrede : String;
  sTitel : String;
  sNachname : String;
  sVorname : String;
  sABCD : String;
  sTermin : String;
  iPos : Integer;
  sTemp : String;
begin
  sl := TStringList.Create;

  Memo1.Lines.AddStrings(sl);

  for i := 0 to sl.Count - 1 do begin
    sTemp := Trim(sl[i]);
    // Falls mal jemand 'ne Leerzeile einschmuggelt:
    if sTemp = '' then continue;
    WriteLn('Quelle: ' + sl[i]); // Ausgabe nur zum Testen
    // Zuerst den Termin holen:
    iPos := Pos('Terminplan',sTemp);
    sTermin := Copy(sl[i],iPos,Length(sTemp));
    // Den Termin entfernen.
    sTemp := Copy(sTemp,1,iPos - 3);
    // Position von " mit " ermitteln
    iPos := Pos(' mit ',sTemp);
    // und alles hinter " mit " holen.
    sABCD := Copy(sTemp,iPos + 5,Length(sTemp));
    // Alles, einschließlich " mit " entfernen.
    sTemp := Copy(sTemp,1,iPos - 1);
    // Gibt es ein Komma, dann gibt es auch einen Vornamen.
    iPos := Pos(', ',sTemp);
    sVorname := '';
    if iPos > 0 then begin
      sVorname := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      sTemp := Copy(sTemp,1,iPos - 1);
    end;
    // Erstes Leerzeichen suchen, davor steht die Anrede.
    iPos := Pos(' ',sTemp);
    sAnrede := Copy(sTemp,1,iPos - 1);
    // Anrede entfernen.
    sTemp := Copy(sTemp,iPos + 1,Length(sTemp));
    // Haben wir 'nen Punkt, so haben wir auch 'nen Titel:
    sTitel := '';
    iPos := Pos('. ',sTemp);
    while iPos > 0 do begin
      sTitel := Format('%s %s',[sTitel,Copy(sTemp,1,iPos)]);
      sTemp := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      iPos := Pos('. ',sTemp);
    end;
    sTitel := Trim(sTitel);
    // Der verbliebene Rest entspricht dem Nachnamen:
    sNachname := sTemp;
    sl[i] := Format('%s;%s;%s;%s;mit %s: %s', [sAnrede, sTitel, sNachname, sVorname, sABCD, sTermin]);
    WriteLn('CSV : ' + sl[i]); // Ausgabe nur zum Testen
  end;
   sl.SaveToFile('c:\users\Julia\documents\stringlist.txt');

  sl.Free;
end;

// === speichern ==============================================
procedure TForm1.Button3Click(Sender: TObject);
var str: TStringlist;
i: integer;
begin
     str := tstringlist.Create;
     try
     Memo1.Lines.SaveToFile('c:\users\Julia\documents\stringlist.txt');
     finally
     str.Free;
     end;

end;

Delphi.Narium 24. Jan 2021 15:58

AW: CSV anpassen
 
Delphi-Quellcode:
// === verarbeitung ==============================================
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
  sl : TStringList;
  sAnrede : String;
  sTitel : String;
  sNachname : String;
  sVorname : String;
  sABCD : String;
  sTermin : String;
  iPos : Integer;
  sTemp : String;
begin
  sl := TStringList.Create;
// Was mag hier wohl in sl sein?
// Ziemlich genau nichts.
// In meinem Beispiel waren die Daten per .Add in die Stringliste eingefügt worden.
// Hier müsstest Du sie daher aus dem Memo übernehmen.
// statt
//   Memo1.Lines.AddStrings(sl);
// eher
  sl.AddStrings(Memo1.Lines);
  for i := 0 to sl.Count - 1 do begin
    sTemp := Trim(sl[i]);
    // Falls mal jemand 'ne Leerzeile einschmuggelt:
    if sTemp = '' then continue;
    // WriteLn('Quelle: ' + sl[i]); // Ausgabe nur zum Testen
    // Zuerst den Termin holen:
    iPos := Pos('Terminplan',sTemp);
    sTermin := Copy(sl[i],iPos,Length(sTemp));
    // Den Termin entfernen.
    sTemp := Copy(sTemp,1,iPos - 3);
    // Position von " mit " ermitteln
    iPos := Pos(' mit ',sTemp);
    // und alles hinter " mit " holen.
    sABCD := Copy(sTemp,iPos + 5,Length(sTemp));
    // Alles, einschließlich " mit " entfernen.
    sTemp := Copy(sTemp,1,iPos - 1);
    // Gibt es ein Komma, dann gibt es auch einen Vornamen.
    iPos := Pos(', ',sTemp);
    sVorname := '';
    if iPos > 0 then begin
      sVorname := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      sTemp := Copy(sTemp,1,iPos - 1);
    end;
    // Erstes Leerzeichen suchen, davor steht die Anrede.
    iPos := Pos(' ',sTemp);
    sAnrede := Copy(sTemp,1,iPos - 1);
    // Anrede entfernen.
    sTemp := Copy(sTemp,iPos + 1,Length(sTemp));
    // Haben wir 'nen Punkt, so haben wir auch 'nen Titel:
    sTitel := '';
    iPos := Pos('. ',sTemp);
    while iPos > 0 do begin
      sTitel := Format('%s %s',[sTitel,Copy(sTemp,1,iPos)]);
      sTemp := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      iPos := Pos('. ',sTemp);
    end;
    sTitel := Trim(sTitel);
    // Der verbliebene Rest entspricht dem Nachnamen:
    sNachname := sTemp;
    sl[i] := Format('%s;%s;%s;%s;mit %s: %s', [sAnrede, sTitel, sNachname, sVorname, sABCD, sTermin]);
//  WriteLn('CSV : ' + sl[i]); // Ausgabe nur zum Testen
  end;
  sl.SaveToFile('c:\users\Julia\documents\stringlist.txt');
  sl.Free;
end;

julchen 25. Jan 2021 20:21

AW: CSV anpassen
 
Hallo und guten Abend,

der Code/ die Codes funktionieren.
Und auch noch, wenn ich dran rumgepfuscht habe.
Das ist die gute Nachricht.

Die schlechte Nachricht:
Die Datei, aus der ich die Daten ziehe, enthält irgendwas an versteckten Zeichen.
Da muss ich mal sehen, wo das Problem ist.
Lade ich die Daten aus meiner Liste, bekomme ich als Ergebnis:
;;;;mit : Herr ...

Schreibe ich den Text direkt ins Memo oder in eine saubere Text-Datei, läuft´s.

Bis dahin und vielen, vielen Dank für alle Supporter,

VG, Julia

Delphi.Narium 26. Jan 2021 11:44

AW: CSV anpassen
 
Das müssen nicht unbedingt versteckten Zeichen (o. ä.) sein.
Ein marginal anderer Aufbau der Textdatei gegenüber Deinen Beispielen könnte schon derartige "Nebenfolgen" haben.

Wäre es möglich, dass Du mal eine "Originaldatei" hier anhängst. Ohne konkrete Daten sehe ich momentan keine Chance, dem Problem auf die Spur zu kommen. Vermutlich ist der Inhalt der Datei etwas anders aufgebaut, als von Dir vermutet / erwartet.

Ausgehend von meinem Script: Wenn die Zeichenfolge 'Terminplan' nicht enthalten ist, wäre das ';;;;mit : Herr ...' eine zu erwartende Folge.

Moombas 26. Jan 2021 12:15

AW: CSV anpassen
 
Ich möchte nochmal die Frage aufwerfen @julchen, hast du nicht ggf. die Möglichkeit die Quelle zu ändern, das von vorneherein eine vernünftige CSV bei dir ankommt, mit der du auch arbeiten kannst?

julchen 26. Jan 2021 15:51

AW: CSV anpassen
 
Hallo Narium,

ich habe es hinbekommen:

Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
  sl : TStringList;
  sAnrede : String;
  sTitel : String;
  sNachname : String;
  sVorname : String;
  sABCD : String;
  sTermin : String;
  iPos : Integer;
  sTemp : String;
 
begin
  sl := TStringList.Create;
  sl.AddStrings(Memo1.Lines);

  try
   for i := 0 to sl.Count - 1 do begin
    sTemp := Trim(sl[i]);
    if sTemp = '' then continue;
    iPos := Pos('mit',sTemp);

    sABCD := Copy(sTemp,iPos + 5,Length(sTemp));
    sTemp := Copy(sTemp,1,iPos - 1);

    iPos := Pos(', ',sTemp);
    sVorname := '';
    if iPos > 0 then begin
      sVorname := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      sTemp := Copy(sTemp,1,iPos - 1);
    end;

    iPos := Pos(' ',sTemp);
    sAnrede := Copy(sTemp,1,iPos - 1);

    sTemp := Copy(sTemp,iPos + 1,Length(sTemp));

    sTitel := '';
    iPos := Pos('. ',sTemp);
    while iPos > 0 do begin
      sTitel := Format('%s %s',[sTitel,Copy(sTemp,1,iPos)]);
      sTemp := Trim(Copy(sTemp,iPos + 1,Length(sTemp)));
      iPos := Pos('. ',sTemp);
    end;
    sTitel := Trim(sTitel);

    sNachname := sTemp;

    sl[i] := Format('%s;%s;%s;%s;mit %s: %s', [sAnrede, sTitel, sNachname, sVorname, sABCD, sTermin]);

  end;

  Memo2.Lines.assign(sl);
  finally
  sl.Free;
  end;
Vielen, vielen Dank an euch alle :love: und bis zum nächsten Problem :pale:

Delphi.Narium 26. Jan 2021 16:26

AW: CSV anpassen
 
Hallo Julchen, bitte ändere Deine Code noch ein bisserl:
Delphi-Quellcode:
//  Statt:
  iPos := Pos('mit',sTemp);
  sABCD := Copy(sTemp,iPos + 5,Length(sTemp));
//  lieber:
  iPos := Pos('mit :',sTemp);
  sABCD := Copy(sTemp,iPos + 5,Length(sTemp));
Ansonsten kannst Du z. B. beim Namen Schmitt oder bei Schmitz auf ein unerwartetes Ergebnis stoßen. Bei denen kommt die Zeichenfolge mit halt schon vor der erwünschten Trennstelle mit : vor. In dem Fall würde das Ergebnis dann deutlich falsch ausfallen.

julchen 26. Jan 2021 17:44

AW: CSV anpassen
 
Danke für den Tipp. :thumb:

An mit im Nachnamen habe ich nicht gedacht.
"mit :" hat es wieder zerrissen, aber mit " mit" läuft bis jetzt. :-D

VG und auf zum nächsten Problem ...

himitsu 26. Jan 2021 17:58

AW: CSV anpassen
 
mittermeier :stupid:

Dann vielleicht mal an RegEx denken (ganzes Wort suchen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.
Seite 4 von 5   « Erste     234 5      

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