Buscar y reemplazar en toda la tabla en un script<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo varias tablas de datos grandes (+100.000 registros) que fueron creadas por un colega en Europa.
Cuando se crearon las tablas, se utilizó el formato de numeración de la UE, es decir, "," es el punto decimal.
Necesito hacer una sustitución en toda la tabla para reemplazar "," por "." para que la tabla funcione con scripts existentes.
Puedo obtener los nombres de las columnas con una declaración get column Names(), pero no puedo entender cómo usar las declaraciones sustituto(...) o sustituir en(...) para hacer un reemplazo en masa.
David
Re: Buscar y reemplazar en toda la tabla en un scriptHola David,
Tuve el mismo problema pero al revés: un reemplazo global de punto a coma delimitadores en una serie de archivos de registro de procesos.
Descubrí que la forma más fácil de salir de esto era guardar cada archivo jmp como un archivo de texto y luego importarlo usando la opción "mejor suposición" de JMP.
Reemplazó los delimitadores originales por el esperado por el sistema (en mi caso, "." fue reemplazado por ",") y reclasificó las columnas de categóricas a continuas. Hice uno manualmente y usé la fuente para un script que procesa el resto.
Re: Buscar y reemplazar en toda la tabla en un scriptInteresante discusión.Jugué con algo de código y obtuve 49 segundos para un cambio de nombre de columna global de 65394 columnas.PC Lenovo T420, Windows 7 de 64 bits, JMP de 64 bits, 4 GB de RAM.
dt = abierto ( "$datos_muestra\Probe.jmp" ) ;
// Ampliar el número de columnas a 65000
// ¡ADVERTENCIA tarda ~10 minutos!
para ( i = 1 , i <= 65000 , i ++,
dt << nueva columna ( "XYZ" || carbonizarse ( i ) , Numérico , Continuo ) ;
) ;
inicio_dt = hoy () ;
lista_nombre_columna = dt << obtener nombres de columnas ( cadena ) ;
Carolina del Norte = ncols ( dt ) ;
Para ( i = 1 , i <= Carolina del Norte , i ++,
nombre_una_col = lista_nombre_columna [ i ] ;
// Sólo cambia el nombre de la columna si contiene la cadena en cuestión
si ( contiene ( nombre_una_col , "X" ) ,
columna ( i ) << escoger un nombre ( sustituto ( nombre_una_col , "X" , "D" )) ;
) ;
) ;
final_dt = hoy () ;
imprimir ( carbonizarse ( final_dt - inicio_dt ) || "segundos por" || carbonizarse ( Carolina del Norte ) || "columnas" ) ;
Re: Buscar y reemplazar en toda la tabla en un scriptIntenté invocar el cuadro de diálogo de búsqueda utilizando el siguiente método, pero no funciona de manera confiable. Parece que el cuadro de diálogo se desconecta cuando la configuración se edita mediante script. Pero tal vez alguien pueda encontrar una manera de mejorar el código.
Si este archivo inusualmente ancho se origina fuera de JMP, puede ser más eficiente editar los nombres de las columnas antes de importar, por ejemplo, mediante un script Perl o VBA que posiblemente pueda activarse desde JSL (puede depender de la plataforma).
dt = tabla de datos actual () ;
viejo = "C" ;
Nuevo = "Q" ;
dt << Traer la ventana al frente ;
// Invocar el diálogo de búsqueda y editar la configuración
Menú principal ( "Encontrar" ) ;
w = ventana ( "Diálogo de búsqueda" ) ;
w [ cuadro de edición de texto ( 1 )] << establecer texto ( viejo ) ;
w [ cuadro de edición de texto ( 2 )] << establecer texto ( nuevo ) ;
si ( w [ Casilla de verificación ( 2 )] << conseguir , w [ Casilla de verificación ( 2 )] << colocar ( 1 )) ;
si ( w [ Casilla de verificación ( 6 )] << conseguir , w [ Casilla de verificación ( 6 )] << colocar ( 1 )) ;
si (( w [ Casilla de verificación ( 7 )] << conseguir ) == 0 , w [ Casilla de verificación ( 7 )] << colocar ( 1 )) ;
w [ caja de botones ( 3 )] << Hacer clic ;
//Menú principal( "Reemplazar todo" );
Re: Buscar y reemplazar en toda la tabla en un scriptTal vez he confundido lo que David preguntaba basándose en su comentario de "Obtener nombres de columnas".Tenía la impresión de que quería cambiar los nombres de las columnas (no los datos reales de las filas).En cualquier caso, eso es lo que intento hacer.Quiero cambiar el nombre de varias columnas (es decir, eliminar "labdata" de cada nombre de columna).Eso es lo que hará mi script anterior.En JSL, se necesitan ~19 segundos en 85.000 columnas.El "Diálogo de búsqueda" tarda sólo una fracción de segundo.
Alguna idea sobre cómo hacer eso ¿Sin un For Loop (o uno súper eficiente)?
Gracias,
jake
Re: Buscar y reemplazar en toda la tabla en un scriptCon JMP 11 en una MacBook Pro obtengo "2 segundos para 5800 filas" o 1,753558 segundos si uso HP time( ) en lugar de Today( ).
A diferencia de lo que se afirma anteriormente, la función de búsqueda y reemplazo incorporada es mucho más lenta aquí. El siguiente código tarda 16,27 segundos en completarse (el código supone que el cuadro de diálogo de búsqueda está "preparado" mediante una búsqueda manual previa).
dt = abierto ( "$Datos_de_muestra\Probe.jmp" ) ;
inicio_dt = tiempo de vida () ;
Menú principal ( "Reemplaza todo" ) ;
final_dt = tiempo de vida () ;
imprimir ( carbonizarse (( final_dt - inicio_dt ) / 1e6 ) || "segundos por" || carbonizarse ( n° ) || "filas" ) ;
Re: Buscar y reemplazar en toda la tabla en un scriptA continuación se muestra un ejemplo con una tabla grande del conjunto de datos de muestra.Sólo tiene 5800 filas y tarda 8 segundos.JMP 11 de 64 bits en un Lenovo T420.Sería interesante comparar diferentes enfoques.
dt = abierto ( "$Datos_de_muestra\Probe.jmp" ) ;
nombres_col = dt << obtener nombres de columnas ( numérico , Cadena ) ;
para ( i = 1 , i <= nitems ( nombres_col ) , i ++,
columna ( dt , nombres_col [ i ]) << tipo de datos ( Personaje ) ;
) ;
inicio_dt = hoy () ;
n° = filas ( dt ) ;
nombres_col = dt << obtener nombres de columnas ( Cadena ) ;
para ( i = 1 , i <= nitems ( nombres_col ) , i ++,
uno_col = columna ( dt , nombres_col [ i ]) ;
para ( k = 1 , k <= n° , k ++,
uno_col [ k ] = sustituto ( uno_col [ k ] , "." , "," ) ; // Reemplazar decimal con coma
) ;
) ;
final_dt = hoy () ;
imprimir ( carbonizarse ( final_dt - inicio_dt ) || "segundos por" || carbonizarse ( n° ) || "filas" ) ;
Re: Buscar y reemplazar en toda la tabla en un scriptHola David,
**Después de escribir todo esto, me di cuenta de que la pregunta original se publicó hace MUCHO tiempo.Sin embargo, mi pregunta "más eficiente" sigue siendo si alguien puede ayudar con eso. **
Estoy tratando de resolver esto mismo.Una solución es emplear un bucle For y trabajar en cada columna individualmente, pero esto puede llevar una cantidad de tiempo considerable dependiendo de su conjunto de datos.El código de ejemplo se enumera a continuación para su referencia.
dt = tabla de datos actual();
Para( i=1,i<=ncol(dt),i++,
nombre de columna = Columna(i) << obtener nombre;
nuevo nombre de columna = munger(colname,1,"replacestring",""); // Podrías hacer algo similar con el comando "Sustituir"
Columna (i) << Establecer nombre (nuevo nombre de columna);
);
¿Alguien conoce una forma más eficiente que For Loop de solucionar esto?Por ejemplo, cuando se utiliza el cuadro de diálogo estándar "Buscar y reemplazar", esto se ejecuta muy rápidamente.Sin embargo, en aproximadamente 65 000 columnas, el enfoque For Loop requiere una cantidad de tiempo considerable.
Gracias,
jake