Hallo,
Gibt es eine integrierte Funktion zum Konvertieren einer Zeichenfolge in eine Liste? Ich habe zum Beispiel eine Zeichenfolge „abcd1234cdef5678“ und möchte, dass sie in {“abcd“, „1234“, „cdef, „5678““} konvertiert wird.
Danke!
Ahmad
Eine andere Technik:
parts = {};
rc = Pat Match( "1234567890abcdefghijklmnopqrstuv", Pat Repeat( Pat Len( 4 ) >> parts[N Items( parts ) + 1] ) );
Show( parts );
parts = {"1234", "5678", "90ab", "cdef", "ghij", "klmn", "opqr", "stuv"};
Jims Ansatz ist für kurze Zeichenfolgen besser, da die nächste Person, die die JSL verwaltet, sie verstehen wird. Bei Zeichenfolgen mit einer Größe von etwa 10 KB ist der Mustervergleich deutlich schneller.
The pattern match (red curve) avoids reprocessing the stringThe pattern match (red curve) avoids reprocessing the stringThe pattern match (red curve) avoids reprocessing the stringThe pattern match (red curve) avoids reprocessing the stringThe pattern match (red curve) avoids reprocessing the stringThe pattern match (red curve) avoids reprocessing the stringDer Mustervergleich (rote Kurve) vermeidet eine erneute Verarbeitung der Zeichenfolge
Das ist die JSL, um das Diagramm zu erstellen ...
dt = New Table( "Untitled",
Add Rows( 0 ),
New Column( "n", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "forloopTime", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "patternTime", Numeric, "Continuous", Format( "Best", 12 ), Set Selected, Set Values( [] ) )
);
For( nstr = 1, nstr < 10000, nstr *= 2,
dt << addrows( 1 );
dt:n = nstr * 4; // four substrings in the repeat...
TheString = Repeat( "abcd1234cdef5678", nstr );
start = Tick Seconds();
TheList = {};
i = 1;
While( Substr( TheString, i, 4 ) != "",
Insert Into( TheList, Substr( TheString, i, 4 ) );
i = i + 4;
);
stop = Tick Seconds();
dt:forloopTime = (stop - start);
start = Tick Seconds();
parts = {};
rc = Pat Match( theString, Pat Repeat( Pat Len( 4 ) >> parts[N Items( parts ) + 1] ) );
stop = Tick Seconds();
dt:patternTime = (stop - start);
Wait( 0 );
);
dt << Graph Builder(
Size( 764, 624 ),
Show Control Panel( 0 ),
Legend Position( "Inside Left" ),
Variables( X( :n ), Y( :forloopTime ), Y( :patternTime, Position( 1 ) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 9 ) ), Smoother( X, Y( 1 ), Y( 2 ), Legend( 10 ) ) ),
SendToReport(
Dispatch( {}, "n", ScaleBox, {Min( -1453.48837209302 )} ),
Dispatch( {}, "forloopTime", ScaleBox, {Format( "Best", 12 ), Min( -0.949803149606299 )} ),
Dispatch( {}, "graph title", TextEditBox, {Set Text( "Compare algorithms" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Text( "n patterns " )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Seconds" )} ),
Dispatch( {}, "400", LegendBox, {Set Title( "" )} )
)
);
Der Grund dafür, dass das for-Schleifenbeispiel bei großen Zeichenfolgen langsamer wird: Die Substr-Funktion muss die Position von finden jede Teilzeichenfolge, beginnend mit dem Anfang . Der Mustervergleich bewegt sich durch die Zeichenfolge einmal .
Mir ist eine solche Funktion nicht bekannt, aber Sie könnten diesen Code verwenden oder daraus eine Funktion machen
Names Default To Here( 1 );
TheString = "abcd1234cdef5678";
TheList = {};
i = 1;
While( Substr( TheString, i, 4 ) != "",
Insert Into( TheList, Substr( TheString, i, 4 ) );
i = i + 4;
);
</CODE></PRE>
<P>Oder hier ist es als Funktion</P>
<PRE><CODE class=" language-jsl">SeparateString = Function( {TheString},
TheList = {};
i = 1;
While( Substr( TheString, i, 4 ) != "",
Insert Into( TheList, Substr( TheString, i, 4 ) );
i = i + 4;
);
TheList;
);
MyList = SeparateString("abcd1234cdef5678");
Hallo Jim,
Wie würden Sie das angehen, wenn Sie eine Zeichenfolge haben und die Zeichenfolge durch ein Komma getrennt werden soll?
Zum Beispiel,
Konvertieren dieses „ C = „Es regnet heute sehr, sehr stark“ in b = { „Es regnet“, „regnet“, „sehr“, „heute stark“ }
Danke!
Aktualisieren:
Ich habe einen älteren Thread dazu gefunden Jeff_Perkinson.
Dies ist der Link . Gelöst: Mehrere Zeichen als Trennzeichen für die Wortfunktion verwenden – JMP-Benutzer-Community
Die Lösung, die für mich funktioniert hat, war die Verwendung dieser Methode:
words(substitute("Test1eeTest2", "ee", "!"),"!")
/*:
{"Test1", "Test2"}
<BR />Danke.
-Freund
Verwenden Sie die Funktion „Words()“, um die Zeichenfolge in eine Liste aufzuteilen, wobei die Elemente die einzelnen Teilzeichenfolgen sind, die durch das angegebene Trennzeichen, in Ihrem Fall ein Komma, identifiziert werden.
names default to here(1);
C = "It is, raining, very, hard today";
b = Words( C, "," );
Wenn Sie eine Zeichenfolge in eine Liste einzelner Zeichen umwandeln (etwas anders als die Anforderung des OP, entspricht aber dem Titel), können Sie Folgendes tun:
Items( "hello", "" );
Gibt Folgendes zurück:
{"h", "e", "l", "l", "o"}