Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   cortar una subcadena al encontrar una coincidencia (https://www.clubdelphi.com/foros/showthread.php?t=64066)

gasparsi 15-03-2009 06:03:47

cortar una subcadena al encontrar una coincidencia
 
Hola a todos:

Necesito de su orientación en lo siguiente:

tengo una tabla de articulos que en el campo descripcion contiene información como: articulo de ejemplo 12/350ml, en algunos es: articulo de ejemplo c/suavizante 20/500ml, o tambien puede ser: otro articulo de ejemplo 25/12/15gr. Quiero saber como hacer para poder quitar lo que está antes del gramaje y pasarlo a otra tabla.

El resultado debe quedar asi:
Tabla1, campo descripcion:
articulo de ejemplo
articulo de ejemplo c/suavizante

otro articulo de ejemplo

tabla2, campo x:
12/350ml
20/500ml

25/12/15gr

Ya estuve revisando las funciones para cadenas, pero la verdad no se me ocurre cómo localizar la parte del gramaje en el string, ya que los numeros varian de producto en producto.

También ya traté con las funciones regexp y like en mysql, pero no veo como usarlas para sustraer las subcadenas que deseo.

Agradeceré cualquier orientación que me puedan dar.

Estoy usando Mysql 5 y Delphi 2009.

Saludos

Al González 15-03-2009 06:33:25

¡Hola!

Lo primero sería determinar qué regla(s) tienen esos valores. Es decir, qué patrón sintáctico aplica a todos, a casi todos, o a la mayoría de las descripciones compuestas.

Preguntas para llegar a esa determinación:

¿Todas terminan con la unidad de medida expresada en letras minúsculas, tras un valor numérico entero y sin espacios entre ese valor y la unidad de medida?

En caso de que el artículo tenga presentaciones en varias medidas, ¿éstas siempre se separan con una diagonal y sin espacios? ¿O podrían ser "25 / 12 / 15", "25,12,15", "25-12-15", etc.?

¿Existen artículos que no tienen una medida numérica en su descripción?

Además de las respuestas a esas preguntas, creo que mostrarnos una nutrida lista de ejemplos reales distintos también ayudaría.

Gracias.

Al González. :)

gasparsi 15-03-2009 07:53:06

ejemplos de descripcion
 
Gracias Al por responder.

A continuación te doy un ejemplo de como son algunas de las descripciones que hay en la tabla:

ARROZ SOS SALVAJE + VAPORIZADO 12/170 GR
ARROZ SOS ROJO LARGO 12/1 KG
SUPER SERIE III SAE MULTIGRADO 15W40 DIESEL C/19 LT
ARROZ SOS PRECOCIDO 12/1 KG.
ARROZ SOS SUSHI 12/1 KG.
ACITE DE OLIVA CARBONELL LATA 24/200 ML
ACITE DE OLIVA CARBONELL LATA 12/1 LT
ACEITE DE OLIVA CARBONELL 3/3 LT
GALLETA MARIA TOSTA RICA 22/200 GR
GALLETA MARIA FLOW TOSTA RICA 21/3X200 GR
BARQUILLO TOSTA RICA FRESA 10/220 GR
BARQUILLO TOSTA RICA VAINILLA 10/220 GR
GALLETA MARIA FLOW PACK TOSTA RICA 12/5X200 GR
GUANTE LATEX ROJO T-7
REP. TRAPEADOR DE TIRAS

El detalle es que estoy queriendo normalizar mi base de datos, para ello quiero poner en una tabla los datos generales del producto, entre ellas solo la descripcion sin gramaje, y en otra las presentaciones, pza, caja, exhibidor con sus datos especificos; pero me topo con este problema que no tiene una regla sintactica por donde entrarle a la solución.

Ojalá me ayudes a encontrar la respuesta.
Gracias

gasparsi 15-03-2009 07:57:29

lo que hice en mysql
 
Al:

Te comento, esta es la instruccion que puse en mysql:
Código SQL [-]
SELECT * FROM articulos where descripcion regexp '[.0-9./0-9.*]'

con esta instruccion trato de encontrar las coincidencias como por ejemplo 99/99xx y de esta manera separar un tanto que tengan algo en comun, pero hasta ahi me quedo, ya que no se como podria cortar texto hasta antes de la coincidencia. :confused:

Saludos

Al González 15-03-2009 20:51:43

Creo que antes de empezar a programar debes terminar de analizar el caso.

¿Hasta cuántos y cuáles datos pueden estar contenidos en estas descripciones? Por ejemplo, ¿"ACITE DE OLIVA CARBONELL LATA 24/200 ML" son tres, cuatro o cinco datos? ('ACITE DE OLIVA CARBONELL', 'LATA', 24, 200, ML) ¿Qué significa ese 24? ¿24 unidades por caja...?

¿Los datos entonces serían nombre, presentación, unidades por empaque, tamaño y unidad de medida? ¿O da igual que los dos primeros vayan juntos?

Tomando los ejemplos que nos has dado, identifico una posible regla sintáctica:

Todas, casi todas o la gran mayoría de las descripciones que llevan un tamaño ("gramaje") y unidad de medida, contienen una diagonal seguida por un dígito decimal (12/170 GR, C/19 LT, 12/5X200 GR) ¿Es correcta la afirmación?

¿Qué significa esa X en "12/5X200"? Entiendo que es un "por", pero ¿cómo influye en la estructura de datos que estamos analizando?

Otra pregunta, ¿es posible que existan descripciones con más de una diagonal o que ésta no forme parte del dato que indica el tamaño? Por ejemplo:

"Chocolate Nicklaus Wirth 1/4 de leche 12/150 GR".

Esperamos sin prisa tu retroalimentación. :)

marcoszorrilla 15-03-2009 21:24:25

Me da la impresión que no tiene arreglo, al menos automático, creo haber topado con un caso similar y tuve que hacer:
1.- Poner un DbEdit mostrado el campo.
2.- Al pulsar el usuario sobre el último caracter válido cortaba por ahí el nombre, Copy(Cadena, Inicio, cuantos);

3.- Esto se iba guardando en una nueva tabla, luego como se supone que estos productos tienen un código único el resto no es dificil de solucionar.

Un Saludo.

gasparsi 16-03-2009 15:16:14

gracias por sus respuestas
 
Gracias Al y marcos pos sus respuestas:

El análisis que propones Al es de bastante ayuda, en realidad tendría que hacer eso si deseo tener bien normalizada mi base de datos, el numero que precede a la diagional tambien es muy buen punto, pero el caso del chocolate es muy cierto y sí, tengo ese problema en algunas descripciones, además de otros casos raros.

La propuesta de marcos acerca de posicionar el cursor en el lugar que se desee cortar la cadena me parece lo más rápido para la solución, ya que me estan presionando en la entrega de estas tablas. Voy a intentar esa solución, no muy elegante, pero al menos un poco más rápida.

Les cuento como me fue, en cuanto termine.

Saludos :)


La franja horaria es GMT +2. Ahora son las 06:05:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi