CSV anpassen
Hallo,
Ich habe eine Liste, die ich nach dem Schema anpassen möchte: Anrede;Titel;Titel;Nachname;Vorname;mit Die Liste ist so aufgebaut: Herr Mustermann mit Herr Mustermann, Max mit Herr Dr. Mustermann mit Herr Dr. Mustermann, Max mit Herr Prof. Dr. Mustermann mit Herr Prof. Dr. Mustermann, Max mit Das Semikolon nach Herr bekomme ich hin mit StringReplace. Nach Prof. wollte ich mit pos und insert das Semikolon einfügen. Funktioniert aber nicht. Was mache ich da falsch?
Code:
VG, Julia
var
s1, s2:string; i: integer; pos1: integer; begin for i := 0 to Memo1.Lines.Count - 1 do begin s1 := Memo1.lines[i]; pos1 := pos('Prof.', s1, pos1 + 1 ); if pos1 <> 0 then begin Insert(';' , s1 , pos1); end; |
AW: CSV anpassen
Möchtest du das Ergebnis im Memo speichern?
Ich frag deshalb, weil du das Ergebnis nur in einer Variable vorhältst und man nicht sehen kann wie du diese weiter verwendest. Wäre evtl. nicht das Ausführen von 2 StringRepace besser? Einmal mit ' ', ';' und einmal mit ', ', ';' Evtl. direkt auf Memo.Text angewendet, falls das Memo das Ergebnis bekommen soll:
Delphi-Quellcode:
Memo.Text := StringReplace( Memo.Text, ' ', ';', [rfReplaceAll] );
Memo.Text := StringReplace( Memo.Text, ',', ';', [rfReplaceAll] ); |
AW: CSV anpassen
.. wenn Du das als csv machen willst,
Dann sollten alles Zeilen die gleiche Anzahl von Elementen enthalten. Herr, , ,Mustermann, ,mit Herr, , ,Mustermann, Max, mit Herr,Dr., ,Mustermann, ,mit Herr,Dr., ,Mustermann, Max, mit Herr,Prof.,Dr.,Mustermann, ,mit Herr,Prof.,Dr., Mustermann, Max, mit Das automatisch hinzubekommenist nicht so einfach. Wie willst Du denn z.B. Namen und Vornamen unterscheiden? Oder ist es bei den Daten sicher, dass zumindest der Nachname aufgelistet ist? Die Titel, würde ich in ein Feld packen, also Prof, Prof. Dr., Prof. Dr. Dr., Grüße Klaus |
AW: CSV anpassen
Ich würde zunächst aufteilen in Nachname , Vorname (mit Pos(',')
anschliessend schauen welche Anreden und Titel noch vor dem Nachname stehen. Dafür brauchst Du ein Array mit allen möglichen Anreden und kannst über eine Schleife diese der Reihe nach im Nachnamen suchen. if Pos( a[i], Copy(nachname, 1, Length(a[i])))=1 then ... Am Ende kannst Du in einer StringList das CSV aufbauen. Es ist dort aber üblich, textelemente in "" zu stellen. |
AW: CSV anpassen
Zitat:
|
AW: CSV anpassen
Hallo und Danke für die bisherige Rückmeldung,
Die Daten sehen so aus, wie im Beispiel angeführt. Einen Nachnamen hat jeder Mitarbeiter. Ich kopiere die Liste in ein Memo. Die Anzahl der vorgegebenen Elemente, seien es Leerzeichen oder Kommas kann ich nicht beeinflussen. Nachname und Vorname sind immer durch ein Komma getrennt. Ich muss mal sehen, ob ich es heute noch schaffe, ein bisschen Code auszuprobieren. VG, Julia |
AW: CSV anpassen
Frage:
1) Kann man davon ausgehen, dass der String IMMER mit einer Anrede anfängt (also Herr, oder Frau)? 2) Kann man davon ausgehen, dass der String IMMER mit dem Wort "mit" endet? Oder kann die Anrede oder das Wort "mit" auch mal wegfallen? Entsprechend kurz oder länger wird der Code. ;-) |
AW: CSV anpassen
CSV geht aber anders. TStringlist... Add(string)... CommaText und schon ist eine Zeile fertig.
Speichern in einer zweiten TStringList. Die auslesen via Text oder SaveToFile. Dann hat man eine CSV Datei. |
AW: CSV anpassen
Zitat:
Es gibt immer ein mit. |
AW: CSV anpassen
Ich habe die Funktion CompareStrings gefunden.
Ich habe da den ganzen Morgen schon mit rumgespielt, aber es klappt nicht. Habe schon alle möglichen Kombinationen durch und komme nicht weiter. Wenn Herr kleiner als Prof ist, dann ein Semikolon, sonst zwei.
Code:
procedure TForm1.Button1Click(Sender: TObject);
var herr, prof: string; begin herr := 'Herr'; prof := 'Prof.'; CompareStrings(herr, prof); end; procedure TForm1.CompareStrings(const herr, prof: string); var result : Integer; i: Integer; begin begin for i := 0 to Memo1.Lines.Count - 1 do result := AnsiCompareText(herr , prof); if result < 0 then begin Memo1.Text := Stringreplace(Memo1.Text, herr, 'Herr;' , [rfReplaceAll]) end end; for i := 0 to Memo1.Lines.Count - 1 do result := AnsiCompareText('Herr;', prof); if result < 0 then begin Memo1.Text := Stringreplace(Memo1.Text, 'Herr' , 'Herr;;' , [rfReplaceAll]) end end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz