Truncar cadenas de caracteres<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo varias tablas de datos que incluyen una columna llamada "Encontrado en la versión".Las versiones principales suelen tener 4 dígitos; las versiones secundarias a veces agregan un carácter alfabético al final de un número de versión principal.A los efectos de la representación gráfica, no quiero mostrar las versiones secundarias, sino que me gustaría fusionar las versiones secundarias con sus versiones principales asociadas.Por ejemplo...si una versión principal es 5.1.2.1, entonces quiero que la versión secundaria 5.1.2.1a también se llame 5.1.2.1...
para agregar otra arruga en la mezcla ---- También puedo convertir todos los 5.1.2.x en 5.1.2---- así que 5.1.2.0, 5.1.2.2a, 5.1.2.3, 5.1.2.4a , etc... se convertiría en la Versión 5.1.2
La columna actual es 'Carácter', 'Nominal'......Estaba pensando en 'truncar' las cadenas de caracteres en la columna a 7 caracteres o 5 dependiendo del nivel de detalle necesario/deseado, pero no estoy seguro de cómo hacerlo o si hay un mejor enfoque.
Además, recibo tablas de datos de diferentes equipos, cada uno parece tener un esquema de versiones diferente, por lo que habrá que incorporar flexibilidad ----- no estoy seguro si tengo que analizar cada dato element s, y compare caracteres comunes para ver si 'pertenecen' a la misma versión ???

Re: Truncar cadenas de caracteresLas respuestas aquí fueron muy útiles y me llevaron a pensar que podría haber estado haciendo esto demasiado complicado, así que probé la función de carácter 'Izquierda' pero no pude hacer que funcionara la semana pasada...mi sintaxis debe haber estado 'apagada' --- porque funcionó para mí hoy ...
| Por cada fila (: Encontrado en Vers truncado = Izquierda (: Encontrado en la Versión, 7)); |
---- esto simplemente trunca la cadena de caracteres a la izquierda de la mayoría de los caracteres... lo que eliminará los caracteres de la versión menor ---ya que los números de versión de varios equipos no son consistentes (algunos equipos usan 4 dígitos con caracteres alfabéticos adjuntos, algunos usan 3 dígitos sin caracteres alfabéticos adjuntos) Creo que este método puede funcionar, pero tendré que probar qué esquema de versión se está usando para determinar el nivel de truncamiento...
Re: Truncar cadenas de caracteresCreo que una expresión regular (regex()) puede solucionar el problema.
Newcolumn("Encontrado en la versión principal",carácter,nominal,
fórmula(regex(:Encontrado en la versión, ".*?(\d+\.\d+\.\d+).*","\1")
);
".*?(\d+\.\d+\.\d+).*" significa encontrar lo suficiente de cualquier cosa, .*?, seguido de un número de cualquier longitud, \d+, decimal una vez, \., un número de cualquier longitud, \d+, decimal una vez, \. , un número de cualquier longitud, \d+, seguido de cualquier cosa. Solo devuelve la parte entre paréntesis, los números y decimales, \1.
Para la versión secundaria, cambie la expresión regular (regex()) para que tenga un decimal y un número más.
Newcolumn("Encontrado en versión menor",carácter,nominal,
fórmula(regex(:Encontrado en la versión, ".*?(\d+\.\d+\.\d+\.\d+).*","\1")
);
Re: Truncar cadenas de caracteresPor otro lado, esta es el arma nuclear de ETL, garantizada para manejar todo, pero más trabajo. Puede encontrar que es la única opción si sus diferentes proveedores siguen procesos significativamente diferentes.
Simplemente cree una tabla de conformidad única para cada proveedor:
los datos tienen;
longitud FoundInVersion $32;
entrada FoundInVersion $;
tarjetas;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9raro
correr;
conversión_maestra de datos;
longitud FoundInVersionGood FoundInVersion $32;
entrada FoundInVersionGood $ FoundInVersion $;
tarjetas;
5.1.2 5.1.2.1
5.1.2 5.1.2.2
5.2.2 5.2.2.2a
5.2.2 5.2.2.3
5.2.2 5.2.2.3x
5.2.2 5.2.2.9
5.2.2 5.2.2.9raro
correr;
proceso sql;
crear tabla quiero como
seleccione FoundInVersionGood como FoundInVersion
desde master_conversion unión interna
have on (master_conversion.FoundInVersion = have.FoundInVersion);
abandonar;
Tomás
Re: Truncar cadenas de caracteresDisculpas por usar el código SAS, ya que no soy un usuario de JMP... ¿quizás existen funciones equivalentes en JMP?
Esto es muy simple y muy tonto, por lo que los datos deben estar bastante conformados:
los datos tienen;
longitud FoundInVersion $32;
entrada FoundInVersion $;
tarjetas;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9raro
correr;
deseo de datos;
longitud FoundInVersionGood $32;
conjunto tener;
/* Usando el punto como delimitador, busque la primera, segunda y tercera palabra (SCAN) y luego concatene con puntos entre (CATX). */
/* asume que siempre habrá al menos tres niveles */
FoundInVersionGood = catx(".", scan(FoundInVersion,1,"."), scan(FoundInVersion,2,"."), scan(FoundInVersion,3,"."));
correr;
Tomás
Re: Truncar cadenas de caracteresEsto hará el truco.Recorre todos los valores y usa expresiones regulares para probar cada valor.
dt = tabla de datos actual () ;
dt << nueva columna ( "Encontrado en Vers truncado" , personaje , nominal ) ;
para ( i = 1 , i <= filas ( dt ) , i ++,
valor_prueba = columna ( dt , "Encontrado en la versión" )[ i ] ;
// Ver si el último carácter es uno de la a a la z
si ( Está perdido ( expresiones regulares ( valor_prueba , "[az]$" )) ,
// entonces
columna ( dt , "Encontrado en Vers truncado" )[ i ] = valor_prueba ;
,
// demás
una_longitud = longitud ( valor_prueba ) ;
columna ( dt , "Encontrado en Vers truncado" )[ i ] = substr ( valor_prueba , 1 , ( una_longitud - 1 )) ;
) ;
) ;
Re: Truncar cadenas de caracteresHola,
No estoy seguro si esto es lo que quieres:
los datos tienen;
entrada antigua :$10.;
tarjetas;
5.1.2
5.1.2.1
5.1.2.1e
;
deseo de datos;
largo nuevo $5;
conjunto tener;
nuevo = viejo;
correr;
proc imprimir;ejecutar;
haikuo