Leerzeichen und DeliminitedText

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Leerzeichen und DeliminitedText

Beitrag von monta »

Kann man der DeliminitedText-Eigenschaft irgendwie beibringen, das ein Leerzeichen kein Grund ist, den Text sofort aufzuteilen?

Das Problem ist halt, das die CSVs welche ich verarbeiten muss, nur QuoteChars enthalten, wenn der string selbst den Deliminiter enthält, ansonsten sind nur Deliminiter gesetzt, wuch wenn der string Leerzeichen enthält was dazu führt das jedes einzelne Wort abgespalten wird :(
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

QuoteChar gesetzt ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Wie soll mir das helfen?

Ich hab doch oben geschrieben, das es in den Originalen keine QuoteChars gibt, außer wenn der Deliminiter im String vorkommt, die Teile sind gequoted, die restlichen strings aber nicht :(
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wie wärs wenn du Delimiter setzt ;)
Danach DelimitedText dann hast den Tex nach Leerzeichen und #13 getrennt.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Beispiel:
Anfang; hier gehts weiter;"sollte;nicht getrennt werden"

Delimiter = ;
QuoteChar = "

Ergebnis sollte sein:
1) Anfang
2) hier gehts weiter
3) sollte;nicht getrennt werden

ist aber
1) Anfang
2) hier
3) gehts
4) weiter
5) sollte;nicht getrennt werden

Ist auch bei mir so. In der 'stringl.inc' ab Zeile 239 sieht man auch wieso.

Es ist aber bei Delphi exakt gleich das Verhalten. (Gerade ein Beispiel mit Turbo Delphi auch ausprobiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich habe mir dafür eine Funktion geschrieben die das kann:

Code: Alles auswählen

function GetTokenExt(str:String; septChar1,septChar2:Char; TokenNr:Integer):String;
var
  x,x1,x2,index,t,l:Integer;
  str1:String;
begin
  l:=Length(str);
  index:=0;  t:=0; x1:=0; x2:=0;
  for x:=1 to l do begin
    if (str[x] = SeptChar2) and (index <> 2) then begin
      index:=2;
    end
    else begin
      if (index = 2) and (str[x] = SeptChar2) then begin
        index:=0;
      end;
    end;
 
    if (x =l ) or (str[x] = SeptChar1) and (index = 0) then begin
      inc(t);
      if t = tokennr then begin
        if x = l then
          str1:=copy(str,x1+1,(x-x1)+1)
        else
          str1:=copy(str,x1+1,x-x1);
 
        break;
      end;
      x1:=x;
    end;
  end;
  result:=str1;
end;

septChar1 ist z.b. ein / oder ein \

septChar2 das ist z.b. ein " oder ein ' oder so je nach dem was er nicht beachten soll.

Ich meine monta als ich gefragt habe hast du doch noch einen anderen Vorschlag gemacht.
Ich bin mit meiner Funktion aber ganz zu frieden. Die mach das was sie machen soll *G*
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Christian hat geschrieben:Wie wärs wenn du Delimiter setzt ;)
Danach DelimitedText dann hast den Tex nach Leerzeichen und #13 getrennt.


Die Daten liegen bereits fertig als 'CSV' vor.

@pluto: Deine Funktion ist ja nett, aber sie liefert ja das ganze auch nur teilweise zurück und man müsste sie noch umschreiben. Und die Performance sollte auch gut sein, weil die CSVs entsprechend groß sind.

@af exakt das Problem getroffen ;)


Aber müsste es nicht einfach langen, in der stringl.inc die folgende Zeile zu ändern:

Code: Alles auswählen

while (j<=length(AValue)) and
           (Ord(AValue[j])>Ord(' ')) and
           (AValue[j]<>FDelimiter) do inc(j);

zu

Code: Alles auswählen

while (j<=length(AValue)) and
           (Ord(AValue[j])>=Ord(' ')) and
           (AValue[j]<>FDelimiter) do inc(j);

Danach FPC neu erstellen und es müsste doch gehen, oder :?:
(Das es nur mit angepasstem FPC läuft wäre in diesem Fall kein Problem, weil nur ich es kompilieren werd)
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

@pluto: Deine Funktion ist ja nett, aber sie liefert ja das ganze auch nur teilweise zurück und man müsste sie noch

Wie teilweise ?
wenn ich so ein String habe
"Test hallo" hallo wie "geht es" dir
dann läuft es prima
gut die Geschwindigkeit dürfte ein Problem sein das gebe ich zu...
MFG
Michael Springwald

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »


Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

monta hat geschrieben:Danach FPC neu erstellen und es müsste doch gehen, oder :?:
(Das es nur mit angepasstem FPC läuft wäre in diesem Fall kein Problem, weil nur ich es kompilieren werd)

Oder die komplette Funktion gleich zu verwenden (und eine eigene daraus zu machen), damit umgehst du, das du den FPC patchen musst (Und bei einem Update darauf vergisst). Und vor allen, wenn du vielleicht noch tabs oder andere Zeichen im csv feststellst, kannst du einfacher darauf reagieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten