![]() |
AW: CSV anpassen
Just for fun mal ein Pascalscript zum Thema:
Delphi-Quellcode:
Die Ausgabe dazu:
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.
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) |
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; |
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; |
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 |
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. |
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?
|
AW: CSV anpassen
Hallo Narium,
ich habe es hinbekommen:
Code:
Vielen, vielen Dank an euch alle :love: und bis zum nächsten Problem :pale:
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; |
AW: CSV anpassen
Hallo Julchen, bitte ändere Deine Code noch ein bisserl:
Delphi-Quellcode:
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.
// Statt:
iPos := Pos('mit',sTemp); sABCD := Copy(sTemp,iPos + 5,Length(sTemp)); // lieber: iPos := Pos('mit :',sTemp); sABCD := Copy(sTemp,iPos + 5,Length(sTemp)); |
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 ... |
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. |
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