Ricerca in ogni cella di una colonna per trovare un contenuto specificoCiao a tutti,
Ho una tabella dati jmp con una colonna che contiene stringhe diverse su ogni riga. Vorrei sapere se posso eseguire il loop di quella colonna per trovare una parte specifica della stringa in quella cella.
Questo un esempio delle stringhe:
Classe: 10 Tabella:15 Stat:NA loc:NA insegnante:Sam --> contenuto della cella
Classe: 11 Tabella:11 Stat:NA loc:NA insegnante:Sam
La sfida è che ho classi diverse e tabelle diverse. Tuttavia, devo solo trovare le celle che iniziano con "Classe: #" e inserire il resto delle celle in un elenco.
Quindi la mia domanda è: posso eseguire una ricerca parziale delle celle in quella colonna specifica?
Automazione e scriptingAnalisi e modellazione dei dati di baseRi: Cercare in ogni cella di una colonna per trovare un contenuto specificoQuesto è un modo possibile per gestire la situazione
Names Default To Here( 1 );
dt = Current Data Table();
foundList = {};
For Each Row(
If(
Word( 1, thestringcolumn, " " ) & Is Missing(
Num( word * 2, thestringcolumn, " " )
) == 0,
Insert Into(
foundList,
Substr(
thestringcolumn,
Length( Word( 1, thestringcolumn, " " ) )
+Length( Word( 2, thestringcolumn, " " ) ) + 2
)
)
)
);Ri: Cercare in ogni cella di una colonna per trovare un contenuto specificoA seconda del formato della stringa, potresti forse utilizzare Ricodifica (nota che Mantieni il testo se nessuna corrispondenza non è selezionata)

o script utilizzando Per ogni riga. Se usi For Each Row, hai molte opzioni diverse per analizzare la stringa e come memorizzare i risultati, di seguito è riportato un altro esempio
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1",
Character,
"Nominal",
Set Values(
{"Class: 10 Table:15 Stat:NA loc:NA teacher:Sam",
"Class: 11 Table:11 Stat:NA loc:NA teacher:Sam"}
)
)
);
result = {};
For Each Row(dt,
res = Regex(:Column 1, "^(Class: \d+) (.*)?", "\2");
If(!IsMissing(res),
Insert Into(result, res);
);
);
show(result);
// result = {"Table:15 Stat:NA loc:NA teacher:Sam", "Table:11 Stat:NA loc:NA teacher:Sam"};Ri: Cercare in ogni cella di una colonna per trovare un contenuto specificoGrazie @jthi . Funziona perfettamente per l'esempio che ho fornito sopra.
Ho una domanda di follow-up, diciamo che abbiamo il seguente elenco di stringhe,
10::Classe: A
11::Classe: A1
12::Classe: A2
..
20::Classe B
21::Classe B1
22::Classe B1
30::Classe C
31::Classe C1
32::Classe C2
Diciamo che voglio fare un elenco per ogni classe. Voglio che il primo sia ClassAList = (11::Class: A ,11::Class: A ,11::Class: A );
Ho provato a modificare regex() per cercare la cifra iniziale in una stringa e quindi spostarla nell'elenco corrispondente. Ho usato qualcosa del genere: Regex("10:::Class" , "[1]")
Il problema qui è che sta cercando [1] in tutta la stringa. È possibile selezionare l'indice in cui la regex dovrebbe cercare una corrispondenza?
L'altro problema qui è che restituisce solo 1, non l'intera stringa.
Qualsiasi consiglio è apprezzato.
Ri: Cercare in ogni cella di una colonna per trovare un contenuto specificoQuesto potrebbe darti un'idea di cosa potresti fare
Names Default To Here(1);
mylist = {"10::Class: A", "11::Class: A1", "12::Class: A2", "20::Class B", "21::Class B1",
"22::Class B1", "30::Class C", "31::Class C1", "32::Class C2"};
class_pattern = "\d+::(Class:? [A-Z])";
aa = Associative Array();
For Each({myitem}, mylist,
res = Regex(myitem, class_pattern, "\1");
If(!Contains(aa, res),
aa[res] = {};
);
Insert Into(aa[res], myitem);
);
show(aa);
https://regex101.com/r/itqqww/1 per la spiegazione del modello regex
Ri: Cercare in ogni cella di una colonna per trovare un contenuto specificoGrazie @jthi . Funziona perfettamente.
Domanda successiva:
Vorrei raggruppare l'elenco in sottogruppi basati solo e soltanto sulla prima cifra. Ho provato a utilizzare le regex Anchors per farlo. Tuttavia, invece di corrispondere solo alla prima cifra, corrisponde alla prima e a qualunque cifra venga dopo. Qualsiasi consiglio è apprezzato.
Ri: Cercare in ogni cella di una colonna per trovare un contenuto specificoIntendi la parte di Classe B1? Puoi modificare la regex aggiungendo \d? tra parentesi ( https://regex101.com/r/Yfh6pZ/1 ). \d corrisponderà a una cifra e ? corrisponderà al token prima di ZERO o UNA volta. Se non vuoi catturare gruppi che non hanno cifre, tralascia ? o sostituiscilo con {1}

[
"Class B" => {"20::Class B"},
"Class B1" => {"21::Class B1", "22::Class B1"},
"Class C" => {"30::Class C"},
"Class C1" => {"31::Class C1"},
"Class C2" => {"32::Class C2"},
"Class: A" => {"10::Class: A"},
"Class: A1" => {"11::Class: A1"},
"Class: A2" => {"12::Class: A2"}
]