Leerzeichen und DeliminitedText
-
- 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
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
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
- 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:
QuoteChar gesetzt ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- 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:
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.
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).
-
- 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)
Ich habe mir dafür eine Funktion geschrieben die das kann:
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*
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
Michael Springwald
-
- 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:
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
-
- 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)
@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
Michael Springwald
-
- Beiträge: 957
- Registriert: Mo 11. Sep 2006, 22:56
Helfen die (beide nicht getestet)?
http://www.hu.freepascal.org/lists/fpc- ... 00533.html
ftp://ftp.cncware.com/pub/fpc/csv.pas
http://www.hu.freepascal.org/lists/fpc- ... 00533.html
ftp://ftp.cncware.com/pub/fpc/csv.pas
- 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:
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).