AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CSV anpassen

Ein Thema von julchen · begonnen am 15. Jan 2021 · letzter Beitrag vom 26. Jan 2021
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: CSV anpassen

  Alt 17. Jan 2021, 11:57
.. 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
Klaus
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

AW: CSV anpassen

  Alt 17. Jan 2021, 11:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: CSV anpassen

  Alt 17. Jan 2021, 12:23
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;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: CSV anpassen

  Alt 17. Jan 2021, 12:48
Was ist Startstext?
Ich kann das nicht deklarieren.
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: CSV anpassen

  Alt 17. Jan 2021, 12:51
Unit System.StrUtils einbinden.

http://docwiki.embarcadero.com/Libra...ils.StartsText
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau (17. Jan 2021 um 12:54 Uhr)
  Mit Zitat antworten Zitat
julchen

Registriert seit: 20. Mär 2008
115 Beiträge
 
Delphi 10.3 Rio
 
#16

AW: CSV anpassen

  Alt 17. Jan 2021, 13:01
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.
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#17

AW: CSV anpassen

  Alt 17. Jan 2021, 13:38
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;
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: CSV anpassen

  Alt 17. Jan 2021, 16:15
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
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: CSV anpassen

  Alt 17. Jan 2021, 16:46
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: CSV anpassen

  Alt 17. Jan 2021, 16:59
.. 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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 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