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
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#1

AW: CSV anpassen

  Alt 16. Jan 2021, 11:09
Wie willst Du denn z.B. Namen und Vornamen unterscheiden?
Wie es aussieht, sind diese schon im Ursprung mit einem Komma (dem einzigen) separiert.
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
 
#2

AW: CSV anpassen

  Alt 16. Jan 2021, 17:23
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
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.305 Beiträge
 
Delphi 12 Athens
 
#3

AW: CSV anpassen

  Alt 16. Jan 2021, 21:07
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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
702 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: CSV anpassen

  Alt 17. Jan 2021, 09:18
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
julchen

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

AW: CSV anpassen

  Alt 17. Jan 2021, 10:39
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.
Die Anrede ist immer Herr oder Frau.

Es gibt immer ein mit.
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
julchen

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

AW: CSV anpassen

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

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

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
383 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

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.305 Beiträge
 
Delphi 12 Athens
 
#9

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
 
#10

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
Antwort Antwort


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 00:35 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