Estrazione di una stringa di caratteri di varia lunghezza e posizioneVoglio estrarre stringhe di caratteri da una variabile (Dx1), ma la lunghezza e la posizione delle stringhe varia, ma sono separate da trattini. A volte ci sono più trattini. Per esempio...
"7812-abcdef-9"
"v7892-xyz-0"
"812-fghkj-0"
"17361-gf-jhyt -9"
Quello che vorrei fare è creare una nuova variabile che estragga le cifre/caratteri prima del primo trattino e poi un'altra variabile che estragga i caratteri tra il primo e il secondo trattino.COSÌ,
Var1 Var2
7812 abcdef
v7892xyz
812 fghkj
17361 gf-jhyt
Ho provato a seguire l'esempio pubblicato qui, ma ha appena estratto il trattino. La modifica del +1 in un altro numero richiede quel numero di caratteri, ma la lunghezza dei miei dati varia.
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
Ecco cosa ho scritto. Che cosa sto facendo di sbagliato?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneIL espressione regolare() funzione potrebbe essere un'alternativa efficiente qui se si verificano problemi di stabilità o prestazioni (e un ciclo while che diventa infinito in una formula di colonna può essere frustrante per il debug).
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneGrazie ancora, Jim.
Ho usato molte più righe di questa. Era solo un'ipotesi.
Ogni caso di DX1 termina con un numero, ma il numero di spazi tra ciò che sto estraendo per Var2 e quel numero varia. Forse è stato proprio questo a causarlo. In ogni caso, la tua soluzione ha funzionato.
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizione65.000 righe non sono una tabella molto grande da gestire per JMP.JMP può gestire tabelle di dati con miliardi di righe.Il problema sono le incoerenze dei dati nella tabella dei dati.Il codice presuppone che verrà trovato almeno un campo numerico dopo aver trovato i valori dei caratteri per Var2. Apparentemente esiste una situazione in cui il valore Dx1 non termina con i numeri.Di seguito è riportata una modifica al formato che si adatta a tale problema
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);
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneGrazie, Jim. È così che l'ho provato in precedenza. Per qualche motivo sembra che JMP Pro 13 si blocchi quando lo eseguo. Forse perché la mia tabella dati è di 65.000 righe?
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneIl codice incluso è una formula di colonna.Ho allegato una tabella dati con la colonna Dx1 che hai utilizzato nel tuo esempio, insieme alle nuove colonne Var1 e Var2 in cui sono specificate le formule di colonna.
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneGrazie, Jim. Questo è quello che stavo cercando.
Come posso eseguire questo script? L'ho provato come formula di colonna. Non ha funzionato, ma non me lo aspettavo. Ho anche aperto una finestra di script e l'ho eseguita lì, ma ha smesso di rispondere.Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneEcco una formula che farà ciò che hai stabilito come regola....
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);
Tuttavia, nell'esempio riportato sopra, l'esempio "17361-gf-jhyt -9" termina con un valore Var2 pari a "gf-jhyt".E 'questo quello che vuoi?
Indipendentemente da ciò, spero che tu possa vedere che puoi costruire una formula tanto complessa quanto potresti aver bisogno per analizzare la stringa in qualunque siano i valori corretti.L'unica limitazione è che è necessario essere in grado di determinare le regole da utilizzare.
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneL'unica regola che mi viene in mente sarebbe coerente sarebbe che la seconda parola appaia tra i numeri (#). Alla fine voglio la frase tra i trattini. Quindi, "#-parola -#" e "#-parola-parola -#" e "#-parola-parola parola -#"
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneJSL consentirà la creazione e l'analisi di tutte queste condizioni complesse.Spetta agli umani determinare quali sono le regole per tale analisi.
Nel tuo esempio, qual è la regola per determinare quali valori con trattino devono essere letti come un valore combinato e quando trattarli come valori separati?
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneC'è un modo per far sì che WORD ignori alcuni trattini? Alcune delle seconde parole che sto cercando di estrarre sono sillabate, quindi ottengo solo un'estrazione parziale. Ad esempio, per "938-ex-marine" ottengo "938" ed "ex" anziché "ex-marine"
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneIL parole la funzione è tua amica qui.Usa il trattino e lo spazio come delimitatori e puoi estrarre facilmente ciò che desideri.Ecco un esempio che utilizza le formule in una tabella:
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] ) )
);Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneGrazie! Funziona bene.
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizioneVuoi utilizzare la funzione Word().Se crei una nuova colonna, "Var1", e inserisci la formula seguente nella colonna, otterrai i risultati desiderati
word(1,:Dx1,"-")
Per Var2 sarebbe:
word(2,:Dx1,"-")
La funzione Word() è documentata nello Scripting Index
Aiuto==>Indice script==>Word
Re: Estrazione di una stringa di caratteri di varia lunghezza e posizione@jswislar :
Un modo per affrontare questo problema potrebbe essere quello di utilizzare le funzioni Contiene e Substr
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])));
);