Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionIch möchte Zeichenfolgen aus einer Variablen (Dx1) extrahieren, aber die Länge und Position der Zeichenfolgen variiert, sie werden jedoch durch Bindestriche getrennt. Manchmal gibt es mehrere Striche. Zum Beispiel...
„7812-abcdef -9“
„v7892-xyz -0“
„812-fghkj -0“
„17361-gf-jhyt -9“
Ich möchte eine neue Variable erstellen, die die Ziffern/Zeichen vor dem ersten Bindestrich extrahiert, und dann eine weitere Variable, die die Zeichen zwischen dem ersten und zweiten Bindestrich extrahiert.Also,
Var1 Var2
7812 abcdef
v7892 xyz
812 fghkj
17361 gf-jhyt
Ich habe versucht, dem hier geposteten Beispiel zu folgen, aber es hat nur den Bindestrich extrahiert. Durch Ändern von +1 in eine andere Zahl wird diese Anzahl an Zeichen extrahiert, aber meine Datenlänge variiert.
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
Hier ist, was ich geschrieben habe. Was mache ich falsch?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDer Regex() Die Funktion könnte hier eine effiziente Alternative sein, wenn Stabilitäts- oder Leistungsprobleme auftreten (und eine While-Schleife, die in einer Spaltenformel ins Unendliche geht, kann beim Debuggen frustrierend sein).
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionNochmals vielen Dank, Jim.
Ich habe viel mehr Zeilen als diese verwendet. Es war nur eine Hypothese.
Jeder Fall von DX1 endet mit einer Zahl, aber die Anzahl der Leerzeichen zwischen dem, was ich für Var2 extrahiere, und dieser Zahl variiert. Vielleicht war das die Ursache. In jedem Fall hat Ihre Lösung funktioniert.
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und Position65.000 Zeilen sind keine sehr große Tabelle, die JMP verarbeiten kann.JMP kann Datentabellen mit Milliarden von Zeilen verarbeiten.Das Problem sind Dateninkonsistenzen in Ihrer Datentabelle.Der Code geht davon aus, dass nach dem Finden der Zeichenwerte für Var2 mindestens ein numerisches Feld gefunden wird. Anscheinend gibt es eine Situation, in der ein Wert von Dx1 nicht mit Zahlen endet.Im Folgenden finden Sie eine Formatänderung, die diesem Problem Rechnung trägt
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1 & Word( i, :Dx1, "-" ) != "",
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDanke, Jim. So habe ich es vorher auch versucht. Aus irgendeinem Grund scheint JMP Pro 13 abzustürzen, wenn ich es starte. Vielleicht, weil meine Datentabelle 65.000 Zeilen umfasst?
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDer enthaltene Code ist eine Spaltenformel.Ich habe eine Datentabelle mit der Spalte Dx1 angehängt, die Sie in Ihrem Beispiel verwendet haben, zusammen mit den neuen Spalten Var1 und Var2, deren Spaltenformeln angegeben sind.
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDanke, Jim. Das ist es, wonach ich gesucht habe.
Wie führe ich dieses Skript aus? Ich habe es als Spaltenformel versucht. Das hat nicht funktioniert, aber das hatte ich auch nicht erwartet. Ich habe auch ein Skriptfenster geöffnet und es dort ausgeführt, aber es reagierte einfach nicht mehr.Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionHier ist eine Formel, die das tut, was Sie als Regel angegeben haben ...
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1,
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
In Ihrem obigen Beispiel erhält das Beispiel „17361-gf-jhyt -9“ jedoch einen Var2-Wert von „gf-jhyt“.Ist es das was du willst?
Unabhängig davon hoffe ich, dass Sie sehen können, dass Sie eine so komplexe Formel konstruieren können, wie Sie benötigen, um die Zeichenfolge in die richtigen Werte zu zerlegen.Die einzige Einschränkung besteht darin, dass Sie in der Lage sein müssen, die Regeln zu bestimmen, die verwendet werden müssen.
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDie einzige Regel, die meiner Meinung nach konsistent wäre, wäre, dass das zweite Wort zwischen Zahlen (#) erscheint. Letztendlich möchte ich die Phrase zwischen den Bindestrichen. Also „#-Wort -#“ und „#-Wort-Wort -#“ und „#-Wort-Wort Wort -#“
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionJSL ermöglicht die Erstellung und Analyse dieser komplexen Bedingungen.Es liegt an den Menschen, die Regeln für eine solche Analyse festzulegen.
Welche Regel gilt in Ihrem Beispiel, um zu bestimmen, welche Werte mit Bindestrich als kombinierter Wert gelesen werden sollen und wann sie als separate Werte behandelt werden sollen?
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionGibt es eine Möglichkeit, WORD dazu zu bringen, einige Bindestriche zu ignorieren? Einige der zweiten Wörter, die ich extrahieren möchte, sind getrennt, sodass ich nur eine teilweise Extraktion erhalte. Zum Beispiel erhalte ich für „938-ex-marine“ „938“ und „ex“ statt „ex-marine“.
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDer Wörter Funktion ist hier dein Freund.Verwenden Sie den Bindestrich und das Leerzeichen als Trennzeichen und Sie können das Gewünschte ganz einfach extrahieren.Hier ist ein Beispiel, das Formeln in einer Tabelle verwendet:
dt = New Table( "Untitled", Add Rows( 4 ),
New Column( "dx1", Character, "Nominal",
Set Values( {"7812-abcdef -9", "v7892-xyz -0", "812-fghkj -0",
"17361-gf-jhyt -9"}
)
),
// Get the first word for Var1
New Column( "Var1", Character, "Nominal", Formula( Words( :dx1, "- " )[1] ) ),
// Get the second word for Var1
New Column( "Var2", Character, "Nominal", Formula( Words( :dx1, "- " )[2] ) )
);Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionDanke! Das funktioniert gut.
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und PositionSie möchten die Funktion Word() verwenden.Wenn Sie eine neue Spalte „Var1“ erstellen und die folgende Formel in die Spalte einfügen, erhalten Sie die gewünschten Ergebnisse
word(1,:Dx1,"-")
Für Var2 wäre es:
word(2,:Dx1,"-")
Die Word()-Funktion ist im Scripting Index dokumentiert
Hilfe==>Skriptindex==>Word
Betreff: Extrahieren einer Zeichenfolge unterschiedlicher Länge und Position@jswislar :
Eine Möglichkeit, dieses Problem anzugehen, könnte darin bestehen, die Funktionen „Contains“ und „Substr“ zu verwenden
a = {"abc-12","abc - 45","abc- 89"};
List1 = list();
List2 = list();
For(i = 1 , i <= N Items(a), i++,
Pos = Contains(a[i],"-");
Insert Into(List1,Substr(a[i],1,Pos-1));
Insert Into(List2,Substr(a[i],Pos+1,Length(a[i])));
);