Contare i passaggi numerici in una stringaQuesto è probabilmente molto specifico, ma ho una stringa contenuta in una cella JMP e ho bisogno di poter isolare un passaggio specifico di caratteri numerici nella stringa. La stringa contiene sia caratteri che numeri e la sequenza può essere variabile. Ad esempio, se ho la voce di cella
aaa1b222c3
e voglio concentrarmi sul passaggio 222, ho preso in considerazione un modo per contare il numero di passaggi numerici come se fossero 3 e poi isolare il secondo di questi.
Ho trovato un modo per farlo con Regex ma è troppo complicato per valere la pena di pubblicarlo. Sono sicuro che ci sia un modo più adattivo per arrivarci. Tutte le idee sono apprezzate.
Ciao
Testa della chiave inglese
Automazione e scriptingRe: Contare i passaggi numerici in una stringaPotresti fornire altri esempi delle possibili stringhe e delle parti che desideri isolare? Inoltre, cosa vuoi fare con quelle parti? Estrarle? Rimuoverle? Controllare se esistono?
Re: Contare i passaggi numerici in una stringaJarmo
Il mio obiettivo generale è creare una nuova colonna che contenga il valore numerico come input di cella. Ciò deriva dal fatto che la voce originale contiene informazioni dimensionali e vorrei che fossero automaticamente disponibili in forma numerica. Uno dei passaggi numerici è una lunghezza, l'altro è una larghezza. Ci sono altri numeri inclusi e ho bisogno di un modo per ignorarli. La stringa effettiva sembrerà più simile a
Val1b200X300
che è un dispositivo lungo 200 e largo 300 e ho bisogno di nuove colonne contenenti celle generate che riflettano quei valori. I caratteri numerici aggiuntivi non sono coerenti in lunghezza o posizionamento, il che aggiunge complessità al compito.
Ciao
Testa della chiave inglese
Re: Contare i passaggi numerici in una stringaSono sempre lunghi tre caratteri? Sono sempre gli ultimi due numeri? Sono sempre separati da "X"?
Re: Contare i passaggi numerici in una stringaJarmo
Violazione parziale della legge di Murphy. Non sempre della stessa lunghezza, non sempre gli ultimi 2 numeri ma sempre separati da una X.
Ciao
Testa della chiave inglese
Re: Contare i passaggi numerici in una stringaQuesto potrebbe essere sufficiente oppure potresti dover aggiungere alcune condizioni extra (controlla che sia all'inizio/alla fine o che ci sia una lettera prima/dopo)
Names Default To Here(1);
str = "Val1b200X300abcc1";
r = Regex Match(str, "(\d+)X(\d+)");
Show(Num(r[2]), Num(r[3]));
Re: Contare i passaggi numerici in una stringaJarmo
Ottima roba! Ecco cosa mi è venuto in mente alla fine. Label è la colonna contenente la stringa su cui sto cercando di eseguire l'operazione.
New Column("Width", Character, "Nominal", Formula(Regex(:Label, "(\d+)X", "\1")), Set Selected);
New Column("Length", Character, "Nominal", Formula(Regex(:Label, "X(\d+)", "\1")), Set Selected);
Sembra funzionare.
Ciao
Testa della chiave inglese
Re: Contare i passaggi numerici in una stringaDipende dai tuoi dati, ma potresti voler aggiungere una piccola aggiunta ai tuoi modelli di espressione regolare: aggiungi il controllo per un altro numero sull'altro lato di X per evitare problemi in cui avresti solo qualcosa come "1Xa"
Names Default To Here(1);
strs = {"A1X2", "A1Xa", "1X2", "a1X23", "aX2", "A1X2a"};
For Each({str}, strs,
a1 = Regex(str, "(\d+)X", "\1");
a2 = Regex(str, "X(\d+)", "\1");
// vs
b1 = Regex(str, "(\d+)X(\d+)", "\1");
b2 = Regex(str, "(\d+)X(\d+)", "\2");
Write("\!NCurrent string: ", str);
Write("\!NFirst pattern matches: ", a1, " ", a2);
Write("\!NSecond pattern matches: ", b1, " ", b2);
Write("\!N");
);
Current string: A1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: A1Xa
First pattern matches: 1 .
Second pattern matches: . .
Current string: 1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: a1X23
First pattern matches: 1 23
Second pattern matches: 1 23
Current string: aX2
First pattern matches: . 2
Second pattern matches: . .
Current string: A1X2a
First pattern matches: 1 2
Second pattern matches: 1 2
Re: Contare i passaggi numerici in una stringaInoltre, la mia prima comprensione del problema iniziale è stata quella di estrarre la sequenza più lunga di numeri da una stringa, quindi ecco alcuni script per farlo (potrebbero essere utili a qualcuno).
1. Utilizzo di Words() (un'idea simile potrebbe essere utilizzata per estrarre stringhe non numeriche)
Names Default To Here(1);
str = "aaa1b222c3";
alphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
nums = Words(str, alphabets);
lengths = Transform Each({num}, nums, Output("Matrix"), Length(num));
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";
2. Utilizzo di While + Regex
Names Default To Here(1);
str = "aaa1b222c3";
nums = {};
strcopy = str;
While(!IsMissing(match = Regex(strcopy, "\d+")),
idx = Contains(strcopy, match);
Insert Into(nums, match);
Remove From(strcopy, idx, Length(match));
);
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";