Estrai il testo dalla stringaCIAO,
Se possibile, vorrei estrarre un testo particolare dalle stringhe:
\\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)
e voglio estrarre gli ID dall'alto:
CTL1083.1
CIL0858.1
CTL1077.1
CMA0851.1
CMS0499.1
CTL1078
CTLR1073
CTLR0999.1
CTL1008.1
Qualsiasi aiuto apprezzato.
Grazie,
Tomasz
Qualità e ingegneria di processoRe: estrarre il testo dalla stringaShh!@Craige_Hales , per favore non dirlo @Byron_JMP . Ferirai davvero i suoi sentimenti. (Pelle sottile, temo)
Re: estrarre il testo dalla stringaPattern matching dici? Cosa ne pensi di questo
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));
È un peccato che non ci sia più documentazione di supporto per imparare a usare il pattern matching. Ero un "Perché preoccuparsi della corrispondenza dei modelli quando hai Regex?" persona finché non ho iniziato a capirlo e ad apprezzarlo meglio (grazie @Craige_Hales !). È incredibilmente veloce e compatto. Per spiegare il codice sopra, Pat Match sta cercando una parentesi aperta seguita da uno o più caratteri da setcaratteri seguito dalla parentesi chiusa o da un ritorno a capo. I risultati da Pat Span sono memorizzati nella variabile nextID . Ogni volta che viene trovato il modello, Pat Test è usato per inserirlo in idList . IL 0 alla fine di Pat Test consente di continuare la ricerca nella stringa di input dalla posizione immediatamente successiva all'ultimo carattere nella stringa corrispondente (ma prima del carattere successivo). Se l'ultima affermazione in Pat Test avesse valutato true (qualsiasi cosa diversa da 0) la ricerca sarebbe terminata, restituendo solo la prima corrispondenza.
Re: estrarre il testo dalla stringaMi piace la semplicità di word() o words() quando funzionerà. Ho scritto di Munger Qui e non capisco più come usarlo. Penso che sia in JMP perché era disponibile su Mac nel 1990 ... non perché fosse un esempio di un buon modo per manipolare le stringhe.
Re: estrarre il testo dalla stringamolto bello, tutti i suggerimenti fanno la magia.
Ho usato il Munger nella mia sceneggiatura e funziona perfettamente.
Molte grazie
Tomasz
Re: estrarre il testo dalla stringaTantissimi modi per affettare una pagnotta in JMP.
Re: estrarre il testo dalla stringa@pmroz , il tuo codice sembra sempre molto meno casuale del mio ; )
Substring (substr) è un approccio più diretto, non posso resistere a un buon caso per munger.
Craig Hales probabilmente ha alcuni approcci ancora più efficienti utilizzando la corrispondenza dei modelli. Sono sicuro che ci sono già alcuni esempi nelle pagine della community o nel suo blog.
Re: estrarre il testo dalla stringaMi piace la funzione "Word ()" per tali estrazioni di stringhe
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], "()" ) )
);Re: estrarre il testo dalla stringaNel caso ti piacciano le espressioni regolari...(Nota: ripulito il codice scritto frettolosamente e sostituito l'elenco di seguito il 12/1/22)
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 );
Re: estrarre il testo dalla stringaIo uso SOST per effetto simile.
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);
);Re: estrarre il testo dalla stringaLa soluzione da @pmroz è molto robusto, bello!
Un approccio leggermente diverso potrebbe consistere nell'utilizzare le formule nella tabella dei dati

La posizione del delimitatore iniziale potrebbe essere individuata con un argomento "Contiene".
Contains(:text, "(")
La posizione del delimitatore finale potrebbe essere individuata allo stesso modo
Contains( :text, ")" )
Un argomento oscuro ma davvero divertente, "munger", potrebbe essere usato per estrarre la stringa tra le posizioni del delimitatore.
In questo caso vogliamo la stringa dopo il carattere delimitatore, che termina prima del carattere delimitatore finale, quindi 1 viene aggiunto all'inizio e sottratto dalla fine.
La funzione per munger in questo caso utilizza gli argomenti, l'intero testo, da dove iniziare, quanti caratteri restituire. Munger può anche fare altre cose interessanti, come trovare e sostituire.
Munger( :text, :start + 1, (:stop - :start) - 1 )
Avvolgere tutto ciò in una formula sarebbe simile a questo
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 1
)
Re: estrarre il testo dalla stringaUtilizzare la funzione PAROLE con ( e ) come delimitatori.Utilizzare il secondo elemento nell'elenco restituito.Eseguire il codice seguente e controllare l'output nella finestra del registro.
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]);
);