Foros del Web » Programando para Internet » PHP »

fgetcsv

Estas en el tema de fgetcsv en el foro de PHP en Foros del Web. Buenas a todos y gracias por antemanos.... Mi problema es con fgetcsv este comando que se utiliza par los cvs... lo que debo de hacer ...
  #1 (permalink)  
Antiguo 24/09/2013, 12:16
 
Fecha de Ingreso: febrero-2009
Mensajes: 188
Antigüedad: 15 años, 2 meses
Puntos: 1
De acuerdo fgetcsv

Buenas a todos y gracias por antemanos....

Mi problema es con fgetcsv este comando que se utiliza par los cvs...
lo que debo de hacer es leer el archivo y luego insertar en la base de datos y lo hace bn asta llegar a la linea 11 donde me da un error de duplicado con un id que no reluce en todo el documento txt....
ayuda
el codigo es.

Código PHP:
<?php
require_once("mysql.php");
if ((
$gestor fopen("archivo.txt""r")) !== FALSE) {
    while ((
$datos fgetcsv($gestor0"|")) !== FALSE) {
        
$numero count($datos);
        
$numero $numero-1;
        
$valores = array();
        for (
$c=0$c <= $numero$c++) {
        
$valores[] = $datos[$c];
        }
        
$campos = array('id','nombre','1','organizacion','clasificacion','2','3','4','fecha','estatus','tipo');
        
$insert $bd->INSERT("tabla"$campos$valores);
        }
    
fclose($gestor);
}
?>
el archivo txt contiene esto

04600235701|FRANCISCO ANTONIO SANTANA||SERVICIOS PERSONALES EN GENERA| | | | |25/06/1999|ACTIVO|NORMAL
00100322338|ISABEL YOLANDA VALENZUELA ROSARIO||SERVICIOS PERSONALES EN GENERA| | | | |25/06/1999|ACTIVO|NORMAL
531028378|COEN GARCIA SARAH JOSEFINA||OTROS NO CLASIFICADOS| | | | |25/06/1999|ACTIVO|NORMAL
501989895|GARCIA GELL JESUS SALVADOR||SERVICIOS PERSONALES EN GENERA| | | | |29/05/2003|ACTIVO|NORMAL
00117328690|WILIAN LEONEL DOTEL PEREZ||OPERACIONES INMOBILIARIAS, INV| | | | |28/10/2002|ACTIVO|NORMAL
00114432149|LUIS ELPIDIO SANTIAGO THEN||EMPLEADOS (ASALARIADOS) | | | | |19/06/2002|ACTIVO|NORMAL
00101262822|MERCEDES DE VARGAS CASTRO||ENSEÑANZA PRIMARIA| | | | |25/06/1999|ACTIVO|NORMAL
502611046|AZCONA RODRIGUEZ DE ESPINAL MARIA ALTAGRACIA||OPERACIONES INMOBILIARIAS, INV| | | | |25/06/1999|ACTIVO|NORMAL
00103716205|MARIA DE LOS ANGELES CASTILLO FERNANDEZ|COLMADO MARIA II|COLMADOS| | | | |04/06/2001|ACTIVO|NORMAL
00104792452|JOCELYNE DEL CARMEN TEJADA GISBERT||SERVICIOS PERSONALES EN GENERA| | | | |16/06/1998|ACTIVO|NORMAL
10000017524|JULIO ENRIQUE NOLASCO SOSA|AGROVETERINARIA DR. NOLASCO|SERVICIOS VETERINARIOS| | | | |17/10/2001|ACTIVO|NORMAL
  #2 (permalink)  
Antiguo 24/09/2013, 12:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: fgetcsv

¿Como esta diseñada tu tabla en la base de datos?
  #3 (permalink)  
Antiguo 24/09/2013, 12:33
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: fgetcsv

No será que tienes una linea vacía (en blanco) al final del txt y cuando intenta leer esa linea se encuentra con un arreglo vacío?
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #4 (permalink)  
Antiguo 24/09/2013, 12:50
 
Fecha de Ingreso: febrero-2009
Mensajes: 188
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: fgetcsv

esta es la composición de la tabla.... son los campos y no no tengo lineas vacías.... ni al inicio ni al final... y el inserta todo bn asta que llega a la linea 11.....

$campos = array('id','nombre','1','organizacion','clasificac ion','2','3','4','fecha','estatus','tipo');
  #5 (permalink)  
Antiguo 24/09/2013, 13:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: fgetcsv

Estaría interesante ver el SQL de la tabla, ya que dices que te da un error de un ID duplicado, ahí se puede observar que columnas tienes como Unique...
  #6 (permalink)  
Antiguo 24/09/2013, 13:15
 
Fecha de Ingreso: febrero-2009
Mensajes: 188
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: fgetcsv

el id lo tengo como no null y primaria y el campo id tiene el siguiente atributo UNSIGNED ZEROFILL... si quieres te puedo dar el

este esl el sql

Cita:
-- phpMyAdmin SQL Dump
-- version 3.5.1
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 24-09-2013 a las 19:19:08
-- Versión del servidor: 5.5.24-log
-- Versión de PHP: 5.3.13

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de datos: `prueva1`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `tabla`
--

CREATE TABLE IF NOT EXISTS `tabla` (
`id` int(11) unsigned zerofill NOT NULL DEFAULT '00000000000',
`nombre` text NOT NULL,
`1` varchar(20) NOT NULL,
`organizacion` text NOT NULL,
`clasificacion` text NOT NULL,
`2` varchar(20) NOT NULL,
`3` varchar(20) NOT NULL,
`4` varchar(20) NOT NULL,
`fecha` text NOT NULL,
`estatus` varchar(30) NOT NULL,
`tipo` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  #7 (permalink)  
Antiguo 24/09/2013, 13:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: fgetcsv

¿que hace tu método INSERTAR?
  #8 (permalink)  
Antiguo 24/09/2013, 14:15
 
Fecha de Ingreso: febrero-2009
Mensajes: 188
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: fgetcsv

solo inserta... tomo los valores del array y los coloca donde van cada uno .... el resultado de ese metodo es este

INSERT INTO `tabla` ( `id`, `nombre`, `1`, `organizacion`, `clasificacion`, `2`, `3`, `4`, `fecha`, `estatus`, `tipo` ) VALUES ( '00117328690', 'WILIAN LEONEL DOTEL PEREZ', '', 'OPERACIONES INMOBILIARIAS, INV', ' ', ' ', ' ', ' ', '28/10/2002', 'ACTIVO', 'NORMAL' )
  #9 (permalink)  
Antiguo 24/09/2013, 14:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: fgetcsv

Pues viendo el código, no veo ningún problema, si te esta dando duplicado es porque en algún lado en tu tabla tienes ese valor, sería bueno que antes de insertar hicieras un TRUNCATE de la tabla, y volvieras a ejecutar tu proceso.
  #10 (permalink)  
Antiguo 24/09/2013, 14:46
 
Fecha de Ingreso: febrero-2009
Mensajes: 188
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: fgetcsv

ya lo hice..
  #11 (permalink)  
Antiguo 25/09/2013, 04:31
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 10
Antigüedad: 10 años, 7 meses
Puntos: 1
Respuesta: fgetcsv

Se me ocurre que le quites la PRIMARY_KEY al id para que permita duplicados.
En teoría debería dejarte entonces el INSERT. Luego ya compruebas si está o no duplicado, o dónde tira el error.
Un saludo.
  #12 (permalink)  
Antiguo 25/09/2013, 06:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: fgetcsv

Cita:
Iniciado por jolucoes Ver Mensaje
Se me ocurre que le quites la PRIMARY_KEY al id para que permita duplicados.
En teoría debería dejarte entonces el INSERT. Luego ya compruebas si está o no duplicado, o dónde tira el error.
Un saludo.
Eso no tiene absolutamente ningún sentido. No puedes eliminar una clave primaria. Plantear eso implica que no se entiende el sentido de una PK, ni su criterio de definición, y además no es el fondo del asunto (y menos una solución).
El problema es que está tratando de insertar en una tabla de una base de datos, un conjunto de datos de una fuente externa, sin tomarse la mínima molestia de validar previamente que los datos que están ingresando para asegurarse que son consistentes y que cumplen las restricciones de datos de la base.
Eso es un error total.

Este problema es usual cuando se intenta consolidar datos entre diferentes bases, o bien diferentes fuentes de datos. no es extraño en esa situación que dos conjuntos de datos tengan valores de clave similares (solapamiento de claves), simplemente porque pertenecen a diferentes bases de origen, donde las PK son locales. Entonces tendrás N veces la PK 1, la 39 o la 1065. pero eso no es un error, el error es insertar ese dato sin verificar que no se esté produciendo el solapamiento.
¿Cual es la solución?
Bueno, no puedes simplemente descartar la PK entrante y poner lo restante de cada registro, porque no puedes asegurar que el resto de los datos no se esté duplicado. Li hicieras eso, podrías procesar el mismo archivo dos veces y te metería dos veces los mismos datos con diferentes PK.
La solución es hacer una preverificación de los datos que represente una clave primaria natural, como por ejemplo, el numero de documento. Si ya existe, no se manda a insertar, si no existe, se inserta.
Si bien eso implicará doble trabajo, al menos será algo seguro.
Finalmente, si los datos entrantes son correctos, y la PK es el documento, y deseas que se inserten sólo aquellos que no existen en base sin necesidad de verificarlos, simplemente usa INSERT IGNORE INTO...
La cláusula IGNORE hará que no se dispare un error si la clave está duplicada, pero tampoco insertará ese registro cuya clave se duplica.
Obviamente, para usar esa cláusula debes estar seguro de que la PK que estás insertando en el campo ID corresponde a la misma persona tanto en el archivo como en la tabla... Si al menos uno no coincide, deberás hacer el otro proceso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: sql, tabla
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 05:13.