Seite 1 von 1

Variable erstellen anhand von Zeichenfolge-Teil

BeitragVerfasst: Mo 17. Mai 2021, 10:06
von garryman90
Hallo,

ich benötige für folgendes Problem Hilfe: Meine Datensätze haben IDs, deren erster Teil der Zeichenfolge ihre Gruppenzugehörigkeit definieren kann. Beispiel:

Variablenname: fb0501

AB-01-01
AB-01-02
AB-01-03
AB-01-04
AB-01-05
...
AB-02-01
AB-02-02
AB-02-03
AB-02-04
AB-02-05
...
XY-04-01
XY-04-02
XY-04-03
XY-04-04
XY-04-05

Ich möchte eine neue Variable bilden, die die ersten 4 Zeichen (5 mit Bindestrich) berücksichtigt, ohne die hinteren 2 (3). Ich bin auch schon ein wenig vorangekommen. Ich habe folgende Syntax erstellt:

STRING fb0501 (A10).
COMPUTE fb0501_neu=CHAR.SUBSTR(fb0501,2).
VARIABLE LABELS fb0501_neu 'TEST'.
EXECUTE.

Das klappt auch schon wunderbar, nur wie erzähle ich dem Kollegen denn, dass er nicht AB Position X die neue Variable erstellen soll, sondern nur BIS Position Y? Die "2" im COMPUTE-Befehl am Schluss muss irgendwie angepasst werden.

Vielen Dank!

Re: Variable erstellen anhand von Zeichenfolge-Teil

BeitragVerfasst: Mo 17. Mai 2021, 10:32
von ponderstibbons
Steht doch in der Funktionsbeschreibung, CHAR.SUBSTR(strexpr,pos[,length]).

Mit freundlichen Grüßen

PonderStibbons

Re: Variable erstellen anhand von Zeichenfolge-Teil

BeitragVerfasst: Mo 17. Mai 2021, 12:24
von garryman90
Danke, stimmt und hat geklappt. Mir ist jetzt ein weiteres Problem aufgekommen: In einer Datei haben nicht alle Datensätze gleichmäßig viele Zeichen zwischen den Bindestrichen der IDs, um die Gruppen zu bilden (z.B. AB-01-01, CD-009-01, BFG-03-034, etc). Ich kann das nur lösen, wenn ich SPSS sage, dass die letzten Zeichen bis zum letzten Bindestrich weggenommen werden sollen.

Das kann ich nicht über die Stringlänge der Substringvariable lösen, da er mir dann hinten bei einigen Datensätzen einfach Leerzeichen wegkürzt, wenn die Zeichenfolge weniger als 10 Zeichen hat. Gibt es eine Möglichkeit SPSS zu sagen, dass er die Zeichenfolge bis zum zweiten "Bindestrich minus 1 Zeichen" erstellen soll?

Danke nochmal.

Re: Variable erstellen anhand von Zeichenfolge-Teil

BeitragVerfasst: Mo 17. Mai 2021, 12:49
von ponderstibbons
CHAR.RINDEX(haystack,needle) ermittlt die Position des letzten Vorkommens von "needle" in haystack.

IF((CHAR.RINDEX(ausgangsvariable,"-") = 6) neuvar = SUBSTR(altvar,1,5) .
EXECUTE .
IF((CHAR.RINDEX(ausgangsvariable,"-") = 7) neuvar = SUBSTR(altvar,1,6) .
EXECUTE .

Oder, falls die Syntax das akzeptiert, einfach
COMPUTE neuvar=SUBSTR(altvar,1,(CHAR.RINDEX(ausgangsvariable,"-")-1) ).
EXECUTE .



Mit freundlichen Grüßen

PonderStibbons

Re: Variable erstellen anhand von Zeichenfolge-Teil

BeitragVerfasst: Mo 17. Mai 2021, 14:41
von garryman90
Ganz stark gelöst, ich musste noch bisschen tüfteln weil er wegen ungültiger Kombination von Datentypen rumgemeckert hat, aber nachdem ich die neuvar nochmal als String deklariert hatte, lief es.

Mit der Abkürzung

COMPUTE neuvar2=CHAR.SUBSTR(Rindexneu,2,CHAR.RINDEX(ausgvar,"-")-1).
EXECUTE .

erhielt ich die Fehlermeldung "Text: )". Ich musste aber noch eine Klammer hinzufügen, sonst hat er die Syntax nicht akzeptiert. Desweiteren hat er mit SUBSTR gemeckert, musste in CHAR.SUBSTR geändert werden. Für alle nachkommenden Leute, hier meine endgültige Lösung:

COMPUTE Rindexneu=CHAR.RINDEX(Ausgangsvariable,'-').
EXECUTE.

String neuvar (a10).

IF (Rindexneu = 5) neuvar = CHAR.SUBSTR.(Ausgangsvariable,1,4).
EXECUTE.
IF (Rindexneu = 6) neuvar = CHAR.SUBSTR.(Ausgangsvariable,1,5).
EXECUTE.
IF (Rindexneu = 7) neuvar = CHAR.SUBSTR.(Ausgangsvariable,1,6).
EXECUTE.
IF (Rindexneu = 8) neuvar = CHAR.SUBSTR.(Ausgangsvariable,1,7).
EXECUTE.

Also, nochmal Danke, Problem erfolgreich gelöst!

MfG
Garry