Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

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)

Klaus01 17. Jan 2021 11:57

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

stifflersmom 17. Jan 2021 11:58

AW: CSV anpassen
 
Da Deine Titel immer eien Punkt beinhalten, kannst Du wohl mit einer Stringlist arbeiten
So mal aus dem Ärmel:

Code:
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;
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.

bernau 17. Jan 2021 12:23

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;

julchen 17. Jan 2021 12:48

AW: CSV anpassen
 
Was ist Startstext?
Ich kann das nicht deklarieren.

bernau 17. Jan 2021 12:51

AW: CSV anpassen
 
Unit System.StrUtils einbinden.

http://docwiki.embarcadero.com/Libra...ils.StartsText

julchen 17. Jan 2021 13:01

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.

EmWieMichael 17. Jan 2021 13:38

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;

bernau 17. Jan 2021 16:15

AW: CSV anpassen
 
Zitat:

Zitat von julchen (Beitrag 1481083)
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.

Das ist Absicht. Vielleicht habe ich dich auch falsch verstanden, aber
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:

Anrede;Titel;Titel;Nachname;Vorname;mit
1. Eintrag = Anrede
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

Klaus01 17. Jan 2021 16:46

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

bernau 17. Jan 2021 16:59

AW: CSV anpassen
 
Zitat:

Zitat von Klaus01 (Beitrag 1481096)
.. wie schonmal angemerk, würde ich die Titel zusammenfassem.

So würde ich es auch machen. Aber wir wissen ja nicht, weshalb die Trennung gewünscht ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 2 von 5     12 34     Letzte »    

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