AW: CSV anpassen
.. CompareStrings vergleicht die Zeichen der Zeichenkette nicht deren Länge.
Da ist es egal ob am Ende ein Semikolon ist oder auch zwei. 'Herr' und 'Prof' unterscheiden sich schon beim ersten Zeichen. Grüße Klaus |
AW: CSV anpassen
Da Deine Titel immer eien Punkt beinhalten, kannst Du wohl mit einer Stringlist arbeiten
So mal aus dem Ärmel:
Code:
Hier gibt es keine Fehlerüberpüfung und sonstige Feinheiten und im Name darf auch kein Punkt vorkommen, aber grundsätzlich siehst Du hier einen gangbaren Weg.
procedure inputcsv;
var sl : TstringList; Anrede, Titel, Name, Vorname, Suffix : String; begin sl := TStringList.Create(); sl.Delimiter := ','; sl.StrictDelimiter := true; Try // Als Beispiel, später sollte das bei Dir eine übergeben Variable an ene Funktion sein, // die als Ausgabe dann Deinen Wunschstring enthält sl.DelimitedText := 'Herr,Prof., Mustermann, Max, mit'; Anrede := sl[0]; If Pos('.',sl[1]) > 0 Then // Titel vorhanden Begin Titel := sl[1]; Name := sl[2]; Vorname := sl[3]; Suffix := sl[4]; end else Begin Titel := ''; Name := sl[1]; Vorname := sl[2]; Suffix := sl[3]; End; Finally sl.free End; |
AW: CSV anpassen
Probier es mal damit. BtnStartClick muss du dir entsprechend anpassen:
Delphi-Quellcode:
Procedure SplitAtPosAndTrim(const aSource: String; const aPosOfRightPart: Integer; var aLeftPart: string; var aRightPart: String);
begin aRightPart := Trim(copy(aSource, aPosOfRightPart, length(aSource) - aPosOfRightPart+1)); aLeftPart := Trim(copy(aSource, 1, aPosOfRightPart-1)); end; Function KonvertToCsvString(aSourceString: String): String; const lTitelVorgaben: array [0 .. 2] of string = ('Dr.', 'Prof.', 'Dipl.-Ing.'); var lAnrede: String; lTitel1: String; lTitel2: String; lNachname: String; lVorname: String; lMit: string; var lpos: Integer; a: Integer; begin //************************************************************* // Vorsorglich Sonderzeichnen und Leerzeichen am Anfang und Ende ntfernen aSourceString := Trim(aSourceString); //************************************************************* // "mit" ist immer vorhanden und muss extrahiert werden SplitAtPosAndTrim(aSourceString, length(aSourceString) - 3, aSourceString, lMit); // Hier ggf kontrollieren, ob Source tatsächlich mit dem Wort "Mit" endete. > "if not SameText(lmit,'mit') then" //************************************************************* // Anrede ist immer als erstes vorhanden. Bis zum ersten Leerzeichen. lpos := PosEx(' ', aSourceString); SplitAtPosAndTrim(aSourceString, lpos, lAnrede, aSourceString); //************************************************************* // Anrede 1 filtern for a := low(lTitelVorgaben) to high(lTitelVorgaben) do if StartsText(lTitelVorgaben[a], aSourceString) then begin SplitAtPosAndTrim(aSourceString, length(lTitelVorgaben[a]) + 1, lTitel1, aSourceString); Break; end; //************************************************************* // Anrede 2 filtern for a := low(lTitelVorgaben) to high(lTitelVorgaben) do if StartsText(lTitelVorgaben[a], aSourceString) then begin SplitAtPosAndTrim(aSourceString, length(lTitelVorgaben[a]) + 1, lTitel2, aSourceString); Break; end; //*************************************************************************************** // Nachname und Vorname ermitteln lpos := pos(',', aSourceString); if lpos = 0 then lNachname := aSourceString else begin SplitAtPosAndTrim(aSourceString, lpos + 1, lNachname, lVorname); // abschliessendes Komma entfernen lNachname := copy(lNachname, 1, length(lNachname) - 1); end; Result := lAnrede + ';' + lTitel1 + ';' + lTitel2 + ';' + lNachname + ';' + lVorname + ';' + lMit; end; procedure TForm1.BtnStartClick(Sender: TObject); var a:Integer; begin for a:=0 to MemoSource.lines.count-1 do MemoDest.lines.add(KonvertToCsvString(MemoSource.Lines[a])); end; |
AW: CSV anpassen
Was ist Startstext?
Ich kann das nicht deklarieren. |
AW: CSV anpassen
|
AW: CSV anpassen
Das sieht schon gut aus.
Es gibt noch einen Fehler. Zwischen Dr. (ohne Prof.) und Nachname werden zwei Semikolons eingefügt. Dadurch verschiebt sich Dr. zu Prof. |
AW: CSV anpassen
Sicher führen viele Wege nach Rom. Hier ist einer davon:
Delphi-Quellcode:
procedure TSIPForm.Test;
var Line, aWord : String; A : Array [1..6] of String; I, K, L : Integer; function GetNextWord(var S:String):String; var P:Integer; begin Result:=''; P:=Pos(#32, S); if (P > 0) then begin Result:=Copy(S, 1, P - 1); Delete(S, 1, P); end; end; begin RichEdit.Clear; RichEdit.Lines.Add('Herr Mustermann mit'); RichEdit.Lines.Add('Herr Mustermann, Max mit'); RichEdit.Lines.Add('Herr Dr. Mustermann mit'); RichEdit.Lines.Add('Herr Dr. Mustermann, Max mit'); RichEdit.Lines.Add('Herr Prof. Dr. Mustermann mit'); RichEdit.Lines.Add('Herr Prof. Dr. Mustermann, Max mit'); RichEdit.Lines.Add(''); for L:=0 to RichEdit.Lines.Count - 1 do if (RichEdit.Lines[L] > '') then begin Line:=RichEdit.Lines[L]; for I:=1 to 6 do A[I]:=''; repeat aWord:=GetNextWord(Line); if (aWord > '') then begin if (A[1] = '') then A[1]:=aWord else begin if (aWord = 'Prof.') or (aWord = 'Dr.') then begin if (A[2] = '') then A[2]:=aWord else A[3]:=aWord; end else begin K:=Pos(',', aWord); if (K > 0) then Delete(aWord, K, 1); if (A[4] = '') then A[4]:=aWord else A[5]:=aWord; end; end; end; A[6]:='mit'; until (aWord = ''); Line:=''; for I:=1 to 6 do Line:=Line + A[I] + ';'; Delete(Line, Length(Line), 1); RichEdit.Lines.Add(Line); end; end; |
AW: CSV anpassen
Zitat:
a) CSV macht m.E. nur Sinn, wenn man einen Wert immer an der gleichen Stelle erwarten kann. b) In deinem eingangspost hast du geschrieben wie das Ergebnis aussehen soll Zitat:
2. Eintrag = Titel1 3. Eintrag = Titel2 4. Eintrag = Nachname 5. Eintrag = Vorname 6. Eintrag = mit Um es mal untereinander darzustellen (Mit dem Zeichen '>' aufgefüllt. Leerzeichen werden hier leider entfernt)
Code:
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 |
AW: CSV anpassen
.. wie schonmal angemerk, würde ich die Titel zusammenfassem.
Denn es gibt auch Menschen die mehr als zwei Titel haben. Prof. Dr. Dr. rer. Nat. Prof. Dr. Dipl.-Ing. usw. Grüße Klaus |
AW: CSV anpassen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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