Foros del Web » Programando para Internet » PHP »

Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Estas en el tema de Importando CSV no me toma DOUBLE, INT, DATE en MySQL en el foro de PHP en Foros del Web. Tengo un archivo CSV: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código CSV: Ver original 900009;200104;;1;00002;01/04/2001;MARROQUINERIA NILDA;1;11.75;CO1;1;900000398;11.75;20000;8;29/06/2004;16:33;LAURE; recibo en PHP: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $file = $_FILES [ ...
  #1 (permalink)  
Antiguo 05/06/2011, 16:56
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Tengo un archivo CSV:

Código CSV:
Ver original
  1. 900009;200104;;1;00002;01/04/2001;MARROQUINERIA NILDA;1;11.75;CO1;1;900000398;11.75;20000;8;29/06/2004;16:33;LAURE;

recibo en PHP:

Código PHP:
Ver original
  1. $file=$_FILES['userfile'];
  2.    
  3. if ($file['type'] == 'application/vnd.ms-excel')
  4. {
  5.  
  6.     $fpname =   $file[  'tmp_name'  ];
  7.     $row    =   0;  
  8.     $fp =   fopen   (   "$fpname"   ,   "r" );
  9.     while ( $data   =   fgetcsv (   $fp ,   1000    ,   ";" )   )
  10.         {
  11.             $num = count ($data);
  12.                     $socio  =   $data[0] ;
  13.                     $periodo    =   $data[1];
  14.                     $forma_pago =   $data[2];
  15.                     $factura    =   $data[3];
  16.                     $articulo   =   $data[4];
  17.                     $vencimiento    =   $data[5];
  18.                     $totalcuota =   $data[14];
  19.                     $cuota  =   $data[7];
  20.                     $importe    =   $data[8];
  21.                     $tipo   =   $data[9];
  22.                     $comprobante    =   $data[10];
  23.                     $recpag =   $data[11];
  24.                     $concepto   =   $data[13];
  25.                     $fecha  =   $data[15];
  26.                     $hora   =   $data[16];
  27.                     $opera_id   =   $data[17];
  28.                     $observacion    =   $data[6];
  29.                    
  30.                    
  31.                 print "Procesando linea: $row <br>";  
  32.                 #$sql   =   "INSERT `sistema_cuota` (`socio`,`periodo`,`forma_pago` ,`factura`,`articulo`,`vencimiento`,`totalcuota`,`cuota`,`importe`,`tipo`,`comprobante`,`recpag`,`concepto`,`fecha`,`hora`,`opera_id`,`observacion`) values ('$socio','$periodo','$forma_pago','$factura','$articulo','$vencimiento','$totalcuota','$cuota','".$importe."','$tipo','$comprobante','$recpag','$concepto','$fecha','$hora','$opera_id','$observacion') ";
  33.                 echo $importe;
  34.                 $sql    =   "INSERT sistema_cuota (`importe`) values ('$importe')";
  35.                 mysql_query("$sql") or die (mysql_error());
  36.             print "Linea procesado: $row , con exito!<br>---------------------------------------------------<br>";
  37.  
  38.         }
  39. }

enfoncandonos en $data[8] o $importe su valor es 11.75

en MySQL al campo importe le asigno DOUBLE (4,2) y si inserto:
$sql = "INSERT sistema_cuota (`importe`) values ('$importe')";

me inserta 0.00

si lo asigno como FLOAT o DECIMAL lo mismo

0.00

Pero si lo asigno TEXT lo toma bien.

Lo mismo me pasa con los campos INT y DATE cosa que es un problema.

Cual es el problema?

Lo raro es que uso el mismo codigo para otro CSV y si me lo toma...
__________________
Mono programando!
twitter.com/eguimariano
  #2 (permalink)  
Antiguo 05/06/2011, 17:58
Avatar de the_web_saint  
Fecha de Ingreso: mayo-2008
Ubicación: localhost/tierra/america/panama
Mensajes: 1.229
Antigüedad: 16 años, 7 meses
Puntos: 43
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Hola SirDuque,

Haz intentado usar CAST para darle el formato númerico?

Slds
__________________
..::The Saint::..
El pesimista se queja del viento; el optimista espera que cambie; el realista ajusta las velas.
  #3 (permalink)  
Antiguo 05/06/2011, 18:30
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Cita:
Iniciado por the_web_saint Ver Mensaje
Hola SirDuque,

Haz intentado usar CAST para darle el formato númerico?

Slds
La verdad no se como usarlo, por que intente esto:

INSERT sistema_cuota (`importe`) values (cast($importe AS INT(10)))

y me sale error:

COC_IMPORYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Despues interprete que por mysql
podria insertarlo en modo TEXT y despues por CAST convertirlo en DOUBLE o FLOAT ?

:S
__________________
Mono programando!
twitter.com/eguimariano
  #4 (permalink)  
Antiguo 05/06/2011, 18:56
Avatar de the_web_saint  
Fecha de Ingreso: mayo-2008
Ubicación: localhost/tierra/america/panama
Mensajes: 1.229
Antigüedad: 16 años, 7 meses
Puntos: 43
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Intenta algo como esto,

Código SQL:
Ver original
  1. INSERT sistema_cuota (`importe`) VALUES (CAST('11.85' AS DECIMAL(22,2)))

Slds
__________________
..::The Saint::..
El pesimista se queja del viento; el optimista espera que cambie; el realista ajusta las velas.
  #5 (permalink)  
Antiguo 06/06/2011, 09:21
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Cita:
Iniciado por the_web_saint Ver Mensaje
Intenta algo como esto,

Código SQL:
Ver original
  1. INSERT sistema_cuota (`importe`) VALUES (CAST('11.85' AS DECIMAL(22,2)))

Slds
tiene el mismo efecto, al recibir del fgetcsv() el $data[8] que es el decimal,
lo inserta como '0', lo que no entiendo es por que los INT DATE y demas los toma como '0' si uso el mismo screep para otras tablas y inserta bien.
Lo peor de todo esta es la principal.

$sql = "INSERT sistema_cuota (`importe`) values (CAST('$importe' as decimal (22,2)) )";

Tabla:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `sistema_cuota` (
  2.   `socio` text COLLATE latin1_general_ci NOT NULL,
  3.   `periodo` text COLLATE latin1_general_ci NOT NULL,
  4.   `forma_pago` text COLLATE latin1_general_ci NOT NULL,
  5.   `factura` text COLLATE latin1_general_ci NOT NULL,
  6.   `articulo` text COLLATE latin1_general_ci NOT NULL,
  7.   `vencimiento` date NOT NULL,
  8.   `totalcuota` text COLLATE latin1_general_ci NOT NULL,
  9.   `cuota` text COLLATE latin1_general_ci NOT NULL,
  10.   `importe` decimal(22,2) NOT NULL,
  11.   `tipo` text COLLATE latin1_general_ci NOT NULL,
  12.   `comprobante` text COLLATE latin1_general_ci NOT NULL,
  13.   `recpag` text COLLATE latin1_general_ci NOT NULL,
  14.   `concepto` text COLLATE latin1_general_ci NOT NULL,
  15.   `fecha` date NOT NULL,
  16.   `hora` time NOT NULL,
  17.   `opera_id` text COLLATE latin1_general_ci NOT NULL,
  18.   `fecha_ob` date NOT NULL,
  19.   `observacion` text COLLATE latin1_general_ci NOT NULL,
  20.   PRIMARY KEY (`id`)
  21. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=36075 ;
la cambien a UTF8 y tampo doy con el clavo.
__________________
Mono programando!
twitter.com/eguimariano
  #6 (permalink)  
Antiguo 06/06/2011, 12:33
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Si inserto:

INSERT sistema_cuota (`importe`) values ('11.75');

en el campo importe VARCHAR(22)

despues lo paso a DECIMAL(22,2)

y TODO anda OK

pero cuando esta en VARCHAR(22)
y le inserto desde el mysql_query de PHP arriba mensionado.
escribe 11.75
pero si lo paso a DECIMAL(22,2)
me pone 0

Se me parte la cabeza.
__________________
Mono programando!
twitter.com/eguimariano
  #7 (permalink)  
Antiguo 06/06/2011, 13:20
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Me encontre con esto:

la variable $importe es string(11) "11.75"
[var_dump($importe);]

despues encontre un explicacion para pasar de string a int/real/float etc.

$variable = (float)$importe;

pero hacer var_dump($variable) me tira :

float(0)
-----------------------------------------

alguien se le ocurre algo?
__________________
Mono programando!
twitter.com/eguimariano
  #8 (permalink)  
Antiguo 06/06/2011, 13:27
Avatar de the_web_saint  
Fecha de Ingreso: mayo-2008
Ubicación: localhost/tierra/america/panama
Mensajes: 1.229
Antigüedad: 16 años, 7 meses
Puntos: 43
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Usa esta función a ver si te funciona.

Código PHP:
Ver original
  1. $var = '122.34343The';
  2. $float_value_of_var = floatval($var);
  3. echo $float_value_of_var; // 122.34343

Slds
__________________
..::The Saint::..
El pesimista se queja del viento; el optimista espera que cambie; el realista ajusta las velas.
  #9 (permalink)  
Antiguo 06/06/2011, 13:31
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Pregunta Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Cita:
Iniciado por the_web_saint Ver Mensaje
Usa esta función a ver si te funciona.

Código PHP:
Ver original
  1. $var = '122.34343The';
  2. $float_value_of_var = floatval($var);
  3. echo $float_value_of_var; // 122.34343

Slds
No lo vas a creer....
Código PHP:
Ver original
  1. echo "VAR_DUMP: ";
  2. var_dump($importe);
  3. echo "<br>".$importe."<br>";
  4. $var = '$importe';
  5. $float_value_of_var = floatval($var);
  6. echo $float_value_of_var;

IMPRIMIO:

VAR_DUMP: string(11) "11.75"
11.75
0

NOTA: $var = '$importe'; $var = "$importe"; $var = $importe; dan el mismo resultado.
__________________
Mono programando!
twitter.com/eguimariano
  #10 (permalink)  
Antiguo 06/06/2011, 13:41
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Agrego:

var_export($importe) ;

imprime:
'' . "\0" . '1' . "\0" . '1' . "\0" . '.' . "\0" . '7' . "\0" . '5' . "\0" . ''

print_r($importe);

imprime:
11.75

var_dump($importe);

imprime:
string(11) "11.75"
__________________
Mono programando!
twitter.com/eguimariano
  #11 (permalink)  
Antiguo 08/06/2011, 10:33
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
Respuesta: Importando CSV no me toma DOUBLE, INT, DATE en MySQL

Encontre algo!


tengo el CSV.

CONCUOTAS5.txt.csv
Código CSV:
Ver original
  1. 900009;200104;;1;00002;2001/04/01;MARROQUINERIA NILDA;1;11.75;CO1;1;900000398;11.75;20000;8;2004/06/29;16:33:00;LAURE

y hola.csv
Código CSV:
Ver original
  1. 900009;200104;;1;00002;2001/04/01;MARROQUINERIA NILDA;1;11.75;CO1;1;900000398;11.75;20000;8;2004/06/29;16:33:00;LAURE

lo cual los subi a este link.

como ven son iguales...
el tema es que a CONCUOTAS5 me inserta 0.00 en mysql y hola.csv me inserta 11.75

JAJAJAJAJAJA me rio de dolor de cabeza, alguien me puede explicar cual puede ser el problema?
por que CONCUOTAS5 (original) tiene 60mil registros, y no voy a poder pasar uno a uno a mano.
__________________
Mono programando!
twitter.com/eguimariano
  #12 (permalink)  
Antiguo 08/06/2011, 12:03
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 10 meses
Puntos: 89
[SOLUCION] Importando CSV no me toma DOUBLE, INT, DATE en MySQL

El CSV estaba en Unicode, y lo guarde en ANSI para que este tome bien las variables...

¿como?
Abri el CSV con el block de nota, le puse guardar como, y abajo cambie unicode por ansi.
__________________
Mono programando!
twitter.com/eguimariano

Etiquetas: csv, date, double, int, mysql, toma
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:19.