Extrahieren Sie Text aus einer ZeichenfolgeHallo,
Wenn möglich, möchte ich einen bestimmten Text aus den Zeichenfolgen extrahieren:
\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)
und ich möchte die IDs von oben extrahieren:
CTL1083.1
CIL0858.1
CTL1077.1
CMA0851.1
CMS0499.1
CTL1078
CTLR1073
CTLR0999.1
CTL1008.1
Jede Hilfe wird geschätzt.
Danke,
Tomasz
Qualitäts- und VerfahrenstechnikBetreff: Text aus String extrahierenPsst!@Craige_Hales , bitte verrate es nicht @Byron_JMP . Du wirst seine Gefühle wirklich verletzen. (Ich fürchte, dünne Haut)
Betreff: Text aus String extrahierenMusterübereinstimmung, sagen Sie? Wie wäre es damit
Names Default to Here(1);
sample = "\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)";
charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.";
idList = {};
Pat Match(sample,"(" + Pat Span(charSet)>>nextID + (")" | "\!r") + Pat Test(Insert Into(idList,nextID);0));
Es ist bedauerlich, dass es keine weitere unterstützende Dokumentation zum Erlernen der Verwendung des Mustervergleichs gibt. Ich fragte mich: „Warum sollte man sich mit dem Mustervergleich beschäftigen, wenn man Regex hat?“ Person, bis ich anfing, es besser zu verstehen und zu schätzen (Danke). @Craige_Hales !). Es ist unglaublich schnell und kompakt. Um den obigen Code zu erklären, Pat Match sucht nach einer offenen Klammer, gefolgt von einem oder mehreren Zeichen von charSet gefolgt von der schließenden Klammer oder einem Wagenrücklauf. Die Ergebnisse von Pat Span werden in der Variablen gespeichert nextID . Jedes Mal, wenn das Muster gefunden wird, Pat-Test wird zum Einfügen verwendet idList . Der 0 am Ende von Pat-Test ermöglicht Ihnen, die Suche in der Eingabezeichenfolge ab der Position unmittelbar nach dem letzten Zeichen in der übereinstimmenden Zeichenfolge (jedoch vor dem nächsten Zeichen) fortzusetzen. Wenn die letzte Aussage in Pat-Test Hätte der Wert „true“ ergeben (alles andere als 0), wäre die Suche beendet und hätte nur die erste Übereinstimmung zurückgegeben.
Betreff: Text aus String extrahierenIch mag die Einfachheit von Word() oder Words(), wenn es funktioniert. Ich habe über Munger geschrieben Hier und verstehe nicht mehr, wie man es benutzt. Ich denke, es ist in JMP enthalten, weil es 1990 auf dem Mac verfügbar war ... nicht, weil es ein Beispiel für eine gute Möglichkeit war, Zeichenfolgen zu manipulieren.
Betreff: Text aus String extrahierenSehr schön, alle Vorschläge wirken zauberhaft.
Ich habe den Munger in meinem Skript verwendet und funktioniert perfekt.
Vielen Dank
Tomasz
Betreff: Text aus String extrahierenWow, es gibt viele Möglichkeiten, in JMP einen Laib Brot zu schneiden.
Betreff: Text aus String extrahieren@pmroz , Ihr Code sieht immer viel weniger willkürlich aus als meiner; )
Substring (substr) ist ein einfacherer Ansatz, ich kann einem guten Argument für Munger einfach nicht widerstehen.
Craig Hales hat wahrscheinlich noch effizientere Ansätze mithilfe des Mustervergleichs. Ich bin mir sicher, dass es auf den Community-Seiten oder seiner Blog-Seite bereits einige Beispiele gibt.
Betreff: Text aus String extrahierenFür solche String-Extraktionen gefällt mir die Funktion „Word()“.
Names Default To Here( 1 );
dt = New Table( "Test Words",
Add Rows( 9 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values(
{"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303",
"\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600",
"\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303",
"\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600",
"\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600",
"\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078",
"\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073",
"\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)",
"\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)"}
),
Set Display Width( 583 )
)
);
For( i = 1, i <= N Rows( dt ), i++,
Print( Word( 2, dt:column 1[i], "()" ) )
);Betreff: Text aus String extrahierenFalls Sie sich für reguläre Ausdrücke interessieren ...(Hinweis: Am 12.01.22 wurde der hastig geschriebene Code bereinigt und die Auflistung unten ersetzt.)
Names Default To Here( 1 );
// make list of example original strings
sample =
"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)";
sample = Words( sample, "\!U000D" );
// Show( sample );
n = N Items( sample );
// iterate over list and return target strings
id = List();
For Each( {string}, sample, Insert Into( id, Regex( string, If( Contains( string, ")" ), "(.+\()(.+)(\).*)", "(.+\()(.+)" ), "\2" ) ) );
Show( id );
Betreff: Text aus String extrahierenich benutze SUBSTR für ähnliche Wirkung.
for (i = 1, i <= nrows(dt), i++,
one_value = dt:column 1[i];
start = contains(one_value, "(") + 1;
end = contains(one_value, ")") - 1;
len = end - start + 1;
result = substr(one_value, start, len);
print(result);
);Betreff: Text aus String extrahierenDie Lösung von @pmroz ist sehr robust, schön!
Ein etwas anderer Ansatz könnte darin bestehen, Formeln in der Datentabelle zu verwenden

Die Position des Starttrennzeichens könnte mit einem „Contains“-Argument ermittelt werden
Contains(:text, "(")
Die Position des Endbegrenzers könnte auf die gleiche Weise lokalisiert werden
Contains( :text, ")" )
Ein obskures, aber wirklich unterhaltsames Argument, „munger“, könnte verwendet werden, um die Zeichenfolge zwischen den Trennzeichenpositionen zu extrahieren.
In diesem Fall möchten wir die Zeichenfolge nach dem Trennzeichen, die vor dem Endtrennzeichen endet, also wird 1 zum Anfang addiert und vom Ende subtrahiert.
Die Funktion für munger verwendet in diesem Fall die Argumente, den gesamten Text, wo begonnen werden soll und wie viele Zeichen zurückgegeben werden sollen. Munger kann auch einige andere interessante Dinge tun, wie zum Beispiel Suchen und Ersetzen.
Munger( :text, :start + 1, (:stop - :start) - 1 )
Das alles in einer Formel zusammenzufassen würde so aussehen
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 1
)
Betreff: Text aus String extrahierenVerwenden Sie die WORDS-Funktion mit ( und ) als Trennzeichen.Verwenden Sie das zweite Element in der zurückgegebenen Liste.Führen Sie den folgenden Code aus und überprüfen Sie die Ausgabe im Protokollfenster.
dt = New Table( "Test Words", Add Rows( 9 ),
New Column( "Column 1", Character, "Nominal",
Set Values(
{
"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303",
"\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600",
"\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303",
"\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600",
"\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600",
"\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078",
"\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073",
"\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)",
"\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)"}
),
Set Display Width( 583 )
)
);
for (i = 1, i <= nrows(dt), i++,
one_value = dt:column 1[i];
word_list = words(one_value, "()");
print(word_list[2]);
);