Buscar en cada celda de una columna para encontrar un contenido específicoHola a todos,
Tengo una tabla de datos jmp con una columna que contiene diferentes cadenas en cada fila. Me gustaría saber si puedo recorrer esa columna para encontrar una parte específica de la cadena en esa celda.
Este es un ejemplo de las cadenas:
Clase: 10 Tabla: 15 Estadísticas: NA loc: NA profesor: Sam --> contenido de la celda
Clase: 11 Tabla: 11 Estadística: NA ubicación: NA profesor: Sam
El desafío es que tengo diferente clase # y diferente mesa #. Sin embargo, solo necesito encontrar las celdas que comienzan con "Clase: #" y agrupar el resto de las celdas en una lista.
Entonces mi pregunta es: ¿puedo hacer una búsqueda de celda parcial en esa columna específica?
Automatización y secuencias de comandosAnálisis y modelado de datos básicosRe: Buscar en cada celda de una columna para encontrar un contenido específicoEsta es una posible forma de manejar esto.
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
)
)
)
);Re: Buscar en cada celda de una columna para encontrar un contenido específicoDependiendo del formato de su cadena, tal vez podría usar Recodificar (tenga en cuenta que Mantener texto si no hay coincidencia no está marcado)

o script usando Para cada fila. Si usa Para cada fila, tiene muchas opciones diferentes para analizar la cadena y cómo almacenar los resultados; a continuación se muestra otro ejemplo.
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"};Re: Buscar en cada celda de una columna para encontrar un contenido específicoGracias @jthi . Esto funciona perfectamente para el ejemplo que proporcioné anteriormente.
Tengo una pregunta complementaria, digamos que tenemos la siguiente lista de cadenas,
10::Clase: A
11::Clase: A1
12::Clase: A2
..
20::Clase B
21::Clase B1
22::Clase B1
30::Clase C
31::Clase C1
32::Clase C2
Digamos que quiero hacer una lista para cada clase. Quiero que el primero sea ClassAList = (11::Class: A ,11::Class: A ,11::Class: A );
Intenté modificar regex() para buscar el dígito inicial en una cadena y luego moverlo a la lista correspondiente. Usé algo como esto: Regex("10:::Class", "[1]")
El problema aquí es que busca [1] en toda la cadena. ¿Es posible seleccionar el índice donde la expresión regular debería buscar una coincidencia?
El otro problema aquí es que solo devuelve 1, no toda la cadena.
Se agradece cualquier orientación.
Re: Buscar en cada celda de una columna para encontrar un contenido específicoEsto podría darte una idea de lo que podrías hacer.
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 para obtener una explicación del patrón de expresiones regulares
Re: Buscar en cada celda de una columna para encontrar un contenido específicoGracias @jthi . Esto funciona perfectamente.
Siguiente pregunta:
Me gustaría agrupar la lista en subgrupos basándose únicamente en el primer dígito. Intenté usar expresiones regulares Anchors para hacerlo. Sin embargo, en lugar de coincidir solo con el primer dígito, coincide con el primero y los dígitos que vienen después. Se agradece cualquier orientación.
Re: Buscar en cada celda de una columna para encontrar un contenido específico¿Te refieres a la parte Clase B1? Puedes modificar la expresión regular agregando \d? entre paréntesis ( https://regex101.com/r/Yfh6pZ/1 ). \d coincidirá con un dígito y ? coincidirá con el token antes de CERO o UNO veces. Si no desea capturar grupos que no tienen dígitos, ¿omita? o reemplácelo 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"}
]