Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-10-2021
Ariqueño Ariqueño is offline
Registrado
 
Registrado: feb 2021
Posts: 8
Poder: 0
Ariqueño Va por buen camino
CSV con datos numericos con decimales.

buenas comunidad.

tengo una tabla con un campo decimal (10,3) al pasar de un archivo csv a mysql con el comando sql "LOAD DATA INFILE" me trunca los decimales.
campo en CSV = -1290,345
campo en la tabla = -1290.000

pienso que la problemática esta en la coma en la CSV y el punto en el campo de la tabla .

hasta el momento no encontrado nada como para solucionar mi problema.
Responder Con Cita
  #2  
Antiguo 13-10-2021
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
hola!!

Una forma de solucionar este problema es almacenar el valor en una variable temporal y establecer el valor correcto del campo en la sección SET del comando LOAD DATA aplicando una sustitución del separador decimal.

Aquí te dejo un ejemplo de como poder hacerlo:

Código SQL [-]
LOAD DATA INFILE 'C://xampp//tmp//tabla.csv'
INTO TABLE `tablacsv`
FIELDS TERMINATED BY ';' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
-- los valores correspondientes a los campos num1, num2, en vez de guardarlos
-- directamente en la BBDD se almacenan en las varibles temporales @num1, @num2
(`id`, `asunto`, @num1, @num2)
-- y en la seccion SET puedes establecer los valores de los campos aplicando los cambios que se deseen
-- en este caso se sustituye la coma decimal por punto
SET `num1`=CONVERT(replace(@num1, ',', '.'), decimal(10,3)),
    `num2`=CONVERT(replace(@num1, ',', '.'), decimal(10,3))
Responder Con Cita
  #3  
Antiguo 13-10-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 638
Poder: 21
mRoman Va por buen camino
Cita:
Empezado por Ariqueño Ver Mensaje
buenas comunidad.

tengo una tabla con un campo decimal (10,3) al pasar de un archivo csv a mysql con el comando sql "LOAD DATA INFILE" me trunca los decimales.
campo en CSV = -1290,345
campo en la tabla = -1290.000

pienso que la problemática esta en la coma en la CSV y el punto en el campo de la tabla .

hasta el momento no encontrado nada como para solucionar mi problema.
Hola Ariqueño.

Usas Excel para tu archivo CSV??...ya que desde ahi lo puedes configurar para que elijas otro separador, por ejemplo pipe "|"...o cambiar la regionalización de tu S.O. (Windows)...ha de estar Español (España).

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #4  
Antiguo 14-10-2021
Ariqueño Ariqueño is offline
Registrado
 
Registrado: feb 2021
Posts: 8
Poder: 0
Ariqueño Va por buen camino
Cita:
Empezado por bucanero Ver Mensaje
hola!!

Una forma de solucionar este problema es almacenar el valor en una variable temporal y establecer el valor correcto del campo en la sección SET del comando LOAD DATA aplicando una sustitución del separador decimal.

Aquí te dejo un ejemplo de como poder hacerlo:

Código SQL [-]
LOAD DATA INFILE 'C://xampp//tmp//tabla.csv'
INTO TABLE `tablacsv`
FIELDS TERMINATED BY ';' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
-- los valores correspondientes a los campos num1, num2, en vez de guardarlos
-- directamente en la BBDD se almacenan en las varibles temporales @num1, @num2
(`id`, `asunto`, @num1, @num2)
-- y en la seccion SET puedes establecer los valores de los campos aplicando los cambios que se deseen
-- en este caso se sustituye la coma decimal por punto
SET `num1`=CONVERT(replace(@num1, ',', '.'), decimal(10,3)),
    `num2`=CONVERT(replace(@num1, ',', '.'), decimal(10,3))
buen dia bucabero.

Código Delphi [-]
    DM.miSQL.SQL.Add('LOAD DATA INFILE :P1');
    DM.miSQL.SQL.Add('INTO TABLE temporal_stock');
    DM.miSQL.SQL.Add('FIELDS TERMINATED BY ";"');
    DM.miSQL.SQL.Add('LINES TERMINATED BY "\r\n"');
    DM.miSQL.SQL.Add('IGNORE 1 LINES');
    DM.miSQL.SQL.Add('(id_prod,nombre,@num1)');
    DM.miSQL.SQL.Add('set final_sala=CONVERT(REPLACE(@num1,",","."),decimal(12,3) '); // problema
    DM.miSQL.ParamByName('P1').Value := edit2.Text;
    DM.miSQL.ExecSQL;

tengo un error de sentencia SQL no puedo usar cremillas simple por ser caracteres reservados del delphi.
como puedo pasar ese error? gracias ..
Responder Con Cita
  #5  
Antiguo 14-10-2021
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Cita:
Empezado por Ariqueño Ver Mensaje
buen dia bucabero.

Código Delphi [-]
    DM.miSQL.SQL.Add('LOAD DATA INFILE :P1');
    DM.miSQL.SQL.Add('INTO TABLE temporal_stock');
    DM.miSQL.SQL.Add('FIELDS TERMINATED BY ";"');
    DM.miSQL.SQL.Add('LINES TERMINATED BY "\r\n"');
    DM.miSQL.SQL.Add('IGNORE 1 LINES');
    DM.miSQL.SQL.Add('(id_prod,nombre,@num1)');
    DM.miSQL.SQL.Add('set final_sala=CONVERT(REPLACE(@num1,",","."),decimal(12,3) '); // problema
    DM.miSQL.ParamByName('P1').Value := edit2.Text;
    DM.miSQL.ExecSQL;

tengo un error de sentencia SQL no puedo usar cremillas simple por ser caracteres reservados del delphi.
como puedo pasar ese error? gracias ..
Hola!!

MySQL no diferencia entre comillas simples y comillas dobles, por lo que puedes usar indistintamente unas u otras.

Para usar en delphi las comillas simples dentro de una cadena entrecomillada, se hace poniendo dos veces la comilla simple por ejemplo

Código Delphi [-]
   DM.miSQL.SQL.Add('set final_sala=CONVERT(REPLACE(@num1, '','', ''.''),decimal(12,3) '); // problema


Por otra parte MySQL te dará error en esta línea
Código SQL [-]
    DM.miSQL.SQL.Add('LOAD DATA INFILE :P1');
puesto que la sentencia LOAD DATA INFILE es muy restrictiva y no acepta parámetros para el nombre del fichero ni integrarla en procedimiento y funciones almacenadas en la BBDD. Por lo que tendrás que poner el nombre del fichero directamente desde delphi
Responder Con Cita
  #6  
Antiguo 14-10-2021
Ariqueño Ariqueño is offline
Registrado
 
Registrado: feb 2021
Posts: 8
Poder: 0
Ariqueño Va por buen camino
Cita:
Empezado por bucanero Ver Mensaje
Hola!!

MySQL no diferencia entre comillas simples y comillas dobles, por lo que puedes usar indistintamente unas u otras.

Para usar en delphi las comillas simples dentro de una cadena entrecomillada, se hace poniendo dos veces la comilla simple por ejemplo

Código Delphi [-]
   DM.miSQL.SQL.Add('set final_sala=CONVERT(REPLACE(@num1, '','', ''.''),decimal(12,3) '); // problema


Por otra parte MySQL te dará error en esta línea
Código SQL [-]
    DM.miSQL.SQL.Add('LOAD DATA INFILE :P1');
puesto que la sentencia LOAD DATA INFILE es muy restrictiva y no acepta parámetros para el nombre del fichero ni integrarla en procedimiento y funciones almacenadas en la BBDD. Por lo que tendrás que poner el nombre del fichero directamente desde delphi
Código Delphi [-]
  DM.miSQL.SQL.Add('LOAD DATA INFILE :P1');
no eh tenido ningún problema con ese parametro en esa línea, pero sigo con los problemas con las comillas.
Responder Con Cita
  #7  
Antiguo 15-10-2021
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola!!

yo he probado con este código y a mi me funciona perfectamente

Código SQL [-]
  ZQuery1.SQL.Add('LOAD DATA LOCAL INFILE :P1');
  ZQuery1.SQL.Add('INTO TABLE `tablacsv`');
  ZQuery1.SQL.Add('FIELDS TERMINATED BY ";" ENCLOSED BY ''"'' ');
  ZQuery1.SQL.Add('LINES TERMINATED BY "\r\n"');
  ZQuery1.SQL.Add('IGNORE 1 LINES');
  ZQuery1.SQL.Add('(`id`, `asunto`, @num1, @num2)');
  ZQuery1.SQL.Add('SET `num1`=CONVERT(replace(@num1, ",", "."), decimal(10,3)), ');
  ZQuery1.SQL.Add('    `num2`=CONVERT(replace(@num2, '','', ''.''), decimal(10,3))');

  ZQuery1.ParamByName('P1').Value := Edit1.text;
  ZQuery1.ExecSQL;

como se aprecia en el código la línea de num1, usa las dobles comillas y para la línea de num2 las comillas simples. Por lo que las comillas no creo que sean el problema, pues se puede usar unas u otras independientemente

En cuanto a lo del parámetro P1 a mi también me ha funcionado usándolo desde el componente de QUERY de DELPHI :-).

Para poder ayudarte mas, indica el error exacto que obtienes
Responder Con Cita
  #8  
Antiguo 15-10-2021
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Cita:
Empezado por Ariqueño Ver Mensaje
buen dia bucabero.

Código Delphi [-]
    ...
    DM.miSQL.SQL.Add('set final_sala=CONVERT(REPLACE(@num1,",","."),decimal(12,3) '); // problema
    ...

tengo un error de sentencia SQL no puedo usar cremillas simple por ser caracteres reservados del delphi.
como puedo pasar ese error? gracias ..
Revisando mas a fondo tu código en esa línea te falta el cierre de paréntesis de la función CONVERT()

Código Delphi [-]
DM.miSQL.SQL.Add('set final_sala=CONVERT(REPLACE(@num1,",","."),decimal(12,3))');

comprueba si puede ser ese el error
Responder Con Cita
  #9  
Antiguo 15-10-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 20
kuan-yiu Va camino a la fama
Siempre que necesites poner comillas en medio de un string que pases desde Delphi a SQL debes usar comillas dobles para que lo pase correctamente: "estoEsLoQuePasoEntrecomillado". No tiene tanto que ver con como maneja tu motor concreto de BD las comillas sino por como maneja Delphi los strings.
Yo normalmente para evitar líos con las comillas uso: QuotedStr(miVariableString). Esto me garantiza el uso de las comillas adecuadas en cada contexto porque uso distintos motores de BD.
Sino tan solo debes capturar la query que está enviando, justo antes del ExecSQL, y ver qué es lo que realmente ejecuta.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Longitud máxima de datos numéricos Drakyto Varios 1 15-05-2010 02:44:42
Sacar datos numericos jon_g461 MS SQL Server 3 18-11-2008 18:01:40
Validación de Datos Numéricos TelloClos Conexión con bases de datos 4 05-12-2007 04:40:44
Datos NumÉricos jadelphi Varios 1 31-03-2005 17:49:07
Usar datos no númericos en un TDBChart Er_Manué OOP 0 27-08-2003 20:58:48


La franja horaria es GMT +2. Ahora son las 01:05:32.


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
Copyright 1996-2007 Club Delphi