String nur bis zum Komma

18. Januar 2008 12:22

Hallo zusammen,

kurz vor dem Wochenende wollte ich mal nachfragen, wie ich das folgende Problem lösen könnte:

Ich habe einen Dataport, der entsprechende Daten aus einer Textdatei einliest.

Eines der Felder enthält Daten, welche mit einem oder mehreren Kommas versehen sind.

Ich möchte in meine Tabelle jedoch nur das einlesen was vor dem Komma auftaucht.

z.B. jeweiliger Feldinhalt in der txt-Datei: Stadt,Land,Fluß
zu übertragender Inhalt für das Feld in der Tabelle: Stadt

Ich weiß, dass ich die Befehle STRPOS,COPYSTR und DELSTR zu benutzen habe, jedoch nicht wie.

Kann jemand helfen und mir sagen, wie die Funktion auszusehen hat?

p.s.: Und bitte dran denken, daß ich erst seit Kurzem mit Navision arbeite.


Vielen Dank.

Mfg

18. Januar 2008 12:28

STRPOS zeigt die Position des ersten Zeichens z.B.
COPYSTR liest einen SubString aus.
DELSTR löscht einen String.
Für detailierte Erklärungen hilft der C/SIDE-Reference Guide.

Meinst Du in etwas das?
Code:
String := 'Stadt,Land,Fluss';
StadtString := copystr(String,1,STRPOS(String,',')-1);

18. Januar 2008 12:41

Noch einfacher geht's vemutlich mit der Funktion SELECTSTR:

SELECTSTR (String)
Use this function to retrieve a substring from a comma-separated string.

NewString := SELECTSTR(Number, CommaString)
Number

Data type: integer

This number tells the system which substring to retrieve. The substrings in the comma-separated string are numbered 1, 2, 3, and so on.

If Number is greater than the actual number of substrings, a run-time error occurs.

CommaString

Data type: option

A string containing substrings separated by commas.

NewString

Data type: option

The substring that the system retrieves from CommaString.

Comments
SELECTSTR treats string values as OPTIONS. This means that identical values in different strings are not allowed.

Example
This example shows how to use the SELECTSTR function:

CommaStr := Text000;
SubStr1 := SELECTSTR(2, CommaStr); // Pick out the 2nd substring
SubStr2 := SELECTSTR(4, CommaStr); // Pick out the 4th substring
MESSAGE(Text001 + '>%1<\' + '>%2<', SubStr1, SubStr2);

Create the following text constants in the C/AL Globals window:

Text Constant
ENU Value

Text000
'This,is a comma,separated,string'

Text001
'The two calls to SELECTSTR return:\'


The message window will show the following:

The two calls to SELECTSTR return:
>is a comma<
>string<


Könnte in Deinem Fall ggf. so aussehen:

Code:
String := 'Stadt,Land,Fluss';
StadtString := SELECTSTR(1, String);

9. Juni 2008 10:30

Hallo Zusammen,

ich habe zu diesem Thema noch eine Frage:

Wie holt man aus diesem String 'Stadt.Land.Fluss' den letzen Teil heraus?

Wenn mann annimmt, dass der Platz an dem "Land" steht eine variable Laenge haben kann und der Platz an dem "Stadt" steht auch?

Danke schon mal!

9. Juni 2008 10:36

gibt es eine elegantere Moeglichkeit als die StringLaenge von Stadt + Land +2 als erste Position anzugeben?

9. Juni 2008 10:41

Am einfachsten tauschst du über CONVERTSTR die Punkte durch Kommas aus und verfährst wie zuvor beschrieben.

Möchtest du dies nicht, dann hole über STRPOS die letzte Position, an der ein Punkt vorkommt und kopiere alles ab der letzten Punkt-Position + 1.

9. Juni 2008 13:00

da sowas ja mal öfter vorkommt haben wir bei uns eine Codeunit (Toolbox) geschrieben mit Funktionen die man für alles mögliche immer mal wieder braucht die einem das Leben vereinfachen. Vielleicht hilft dir die Funktion hier weiter

Split

Code:

Split(String : Text[250];Separator : Text[30];Index : Integer) value : Text[250]
value := String;
pos := STRPOS(value, Separator);
WHILE (pos > 0) AND (Index > 1) DO BEGIN
  value := COPYSTR(value, pos+1);
  Index -= 1;
  pos := STRPOS(value, Separator);
END;

IF pos > 0 THEN
  value := COPYSTR(value, 1, pos-1);

EXIT(value);


dementsprechend :

Werte := 'Land,Stadt,Name';
Stadt := Split(Werte , ',' , 2);

Re: String nur bis zum Komma

3. Februar 2010 14:26

Hallo NewComer

Irgendwie steh ich auf dem Schlauch. Für was steht diese Zeile?
Code:
Index -= 1;

Re: String nur bis zum Komma

3. Februar 2010 14:40

Code:
Index := Index -1;


für schreibfaule :wink:

Gruß, Fiddi

Re: String nur bis zum Komma

3. Februar 2010 14:59

Nein, gemeint ist wieso zähl ich den Index 1 weg?

Bzw. wie würde es aussehen, wenn ich alle Werte in ein Array packen will? Ich habe den Code wie folgt angepasst.

Code:
Split(VAR ArryStr : ARRAY [4] OF Text[250];String : Text[250];Separator : Text[30])

value := String;

FOR Index := 1 TO 4 DO BEGIN
  pos := STRPOS(value, Separator);
  WHILE (pos > 0) AND (Index > 1) DO BEGIN
    value := COPYSTR(value, pos+1);
    Index -= 1;
    pos := STRPOS(value, Separator);
  END;

  IF pos > 0 THEN BEGIN
    value := COPYSTR(value, 1, pos-1);
    ArryStr[Index] := value;
  end;

end;


Habe die value als lokale Variable deklariert. Es scheitert eben an dieser Zeile. Er füllt immer nur den ersten Array (ArryStr[1]). Wäre es besser mit zwei Index zu arbeiten? Etwa so:

Code:
Split(VAR ArryStr : ARRAY [4] OF Text[250];String : Text[250];Separator : Text[30])

value := String;

FOR n := 1 TO 4 DO BEGIN
  pos := STRPOS(value, Separator);
  Index := n;
  WHILE (pos > 0) AND (Index > 1) DO BEGIN
    value := COPYSTR(value, pos+1);
    Index -= 1;
    pos := STRPOS(value, Separator);
  END;

  IF pos > 0 THEN BEGIN
    value := COPYSTR(value, 1, pos-1);
    ArryStr[n] := value;
  end;

end;

Re: String nur bis zum Komma

3. Februar 2010 15:48

Ich hab das ganze mal so gelöst:

Code:
PROCEDURE Splitstr(str : Text[250];SplitChar : Text[1];VAR ResArray : ARRAY [10] OF Text[30]) : Integer
VAR
      ai : integer;
BEGIN
  CLEAR(ResArray); 
  ai:=0;
  str := DELCHR(str,'>',SplitChar)+SplitChar;
  WHILE (STRLEN(str) >0) DO BEGIN
    ai +=1;
    i := STRPOS(str,SplitChar);
    ResArray[ai] := COPYSTR(str,1,i);
    str := COPYSTR(str,i+1,250);
  END;
  EXIT(ai);
END;


Gruß, Fiddi

Re: String nur bis zum Komma

3. Februar 2010 16:33

Wäre es nicht einfacher gewesen, mit SELECTSTR zu arbeiten?

Re: String nur bis zum Komma

3. Februar 2010 16:57

Bei "Strasse,Ort,Strasse" zum Beispiel würde es eine Fehlermeldung geben. SELECTSTR erlaubt den Wert jeweils nur einmal.

Re: String nur bis zum Komma

3. Februar 2010 16:59

Michelle hat geschrieben:SELECTSTR erlaubt den Wert jeweils nur einmal.

Argh, immer diese Einschränkungen :roll:

Re: String nur bis zum Komma

3. Februar 2010 17:37

Danke fiddi

Habe noch

Code:
ResArray[ai] := COPYSTR(str,1,i);


angepasst mit

Code:
ResArray[ai] := COPYSTR(str,1,i - 1);


da ich den SplitChar im Array nicht brauche.

Re: String nur bis zum Komma

3. Februar 2010 18:05

das sollte so funktionieren :-)

Gruß, Fiddi