Foros del Web » Programando para Internet » PHP »

Excel-mysql Sin Csv

Estas en el tema de Excel-mysql Sin Csv en el foro de PHP en Foros del Web. quiero leer un archivo de excel que en cada columna hay un valor que se debe insertar en cada col. de la base de datos. ...
  #1 (permalink)  
Antiguo 25/04/2006, 16:07
 
Fecha de Ingreso: abril-2005
Ubicación: colombia
Mensajes: 242
Antigüedad: 19 años
Puntos: 0
Excel-mysql Sin Csv

quiero leer un archivo de excel que en cada columna hay un valor que se debe insertar en cada col. de la base de datos. no esta separado por comas hay alguna forma de leer este archivo que no sea con la funcion fgetcsv ya que no lo tengo separado por comas sino por columnas. ademas como hago para que empiece a leer desde la segunda fila , ya que en la primera hay unos encabezados . No puedo convertir el archivo a csv ya que el formato es ese y no se puede cambiar.

gracias
__________________
:aplauso: Ivomat
  #2 (permalink)  
Antiguo 26/04/2006, 06:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si no está separado por "comas" tendrá algún otro separador .. ya sea algún caracter específico .. algún código de control (lease: salto de linea? tabulador? .. ) o incluso algún "patron" que indentifique esos datos: algo tipo .. del caracter 1 al N es tal campo .. del N+X será el otro .. etc ...

Debes especificar o tener claro ese "separador" cual es .. así podrás aplicar funciones como: file() para leer tu archivo "linea a linea" (por salto de línea \n así se identificaran tus "registros" de ese CSV) y explode() al caracter que uses de separador para identificar tus "campos".

De todas formas .. si lees bien la documentación de fgetcvs() .. no te "obliga" a que uses como delimintador una "coma" .. puede ser el caracter que necesites simpre y cuando como es normal lo conozcas. Incluso si el dato en sí está encerrado ("enclosure") entre algunos caracteres (como " comillas " como suele pasar...) también puedes indicarlo.

fgetcsv ( resource handle [, int length [, string delimiter [, string enclosure]]] )


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 26/04/2006 a las 06:42
  #3 (permalink)  
Antiguo 26/04/2006, 11:09
 
Fecha de Ingreso: abril-2005
Ubicación: colombia
Mensajes: 242
Antigüedad: 19 años
Puntos: 0
f_archivo es el nombre del campo file en el formulario
Código PHP:
   $nombre  $_FILES["f_archivo"]["name"];
   
$tamano  $_FILES["f_archivo"]["size"];  
   
$handle = @fopen($nombre"r");
   while (
$data fgetcsv($handle,$tamano,"\t")) {
      
$array = array(
         
"codigo" => trim($data[0]),
         
"descripcion" => trim($data[1]),
         
"sexo" => trim($data[2]),
         
"limInf" => trim($data[3]),
         
"limSup" => trim($data[4]));
         
$codigo utf8_encode(trim($data[0]));
         
$descripcion utf8_encode(trim($data[1]));
         
$sexo utf8_encode(trim($data[2]));
         
$limInf trim($data[3]);
         
$limSup trim($data[4]);
         
$query mysql_query("INSERT INTO tb_diagnostico(codigo,descripcion,sexo,limInf,limSup) VALUES('$codigo','$descripcion','$sexo','$limInf','$limSup')");
 
     }
        
fclose ($handle); 
estoy haciendo esto pero me esta guardando caracteres basura, el separador es el tab porque en cada columna hay un dato.
gracias
__________________
:aplauso: Ivomat
  #4 (permalink)  
Antiguo 26/04/2006, 11:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
estoy haciendo esto pero me esta guardando caracteres basura, el separador es el tab porque en cada columna hay un dato.
gracias

Vamos aclarando cosas:

1) ¿Tu ya tienes claro la separación de tus datos: "registros" y "campos" (filas y columnas de ese archivo de texto plano de origen)?. Parece que esto de momento si?

2) Aplicas una codificación UTF-8 a los datos que lees de tu archivo de texto plano .. No sé si ya has revisado el dato "puro" que lees $data[n°] .. Tampoco veo claro para que defines un array pero luego defines variables simples? (eso cunfunde .. si no lo usas .. "limpia" tu código ..Expón ejemplos lo más "limpios" posibles de pruebas o fuera de contexto (nosotros no sabemos que hay más detras de todo eso ..))

3) .. ¿Que es "texto basura" según tu criterio?. Algún ejemplo del texto original y del que tras tu proceso queda? ... (a veces viendo eso se identifican problemas con caracteres de escape que se añaden a un a una " ..(comilla).. o similar. O de codificación ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 26/04/2006, 13:16
 
Fecha de Ingreso: abril-2005
Ubicación: colombia
Mensajes: 242
Antigüedad: 19 años
Puntos: 0
es esto lo que me sale
INSERT INTO tb_diagnostico (codigo,descripcion,sexo,limInf,limSup) VALUES('ÐÏࡱá>þÿ',''þÿÿÿþÿÿÿ','','','') .
tienes razon no esta muy "limpio" ya arregle mi codigo . el archivo es de excel y es una archivo normal donde en cada columna hay un dato,.ademas como hago para que empiece a leer en la segunda fila.

Código PHP:
$nombre  $_FILES["f_archivo"]["name"];
   
$tamano  $_FILES["f_archivo"]["size"];  
   
$handle = @fopen($nombre"r");
   while (
$data fgetcsv($handle,$tamano,"\t")) {
      
$array = array(
         
"codigo" => trim($data[0]),
         
"descripcion" => trim($data[1]),
         
"sexo" => trim($data[2]),
         
"limInf" => trim($data[3]),
         
"limSup" => trim($data[4]));
         
$query mysql_query("INSERT INTO tb_diagnostico (codigo,descripcion,sexo,limInf,limSup) VALUES('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]')");

     }
?> 
__________________
:aplauso: Ivomat
  #6 (permalink)  
Antiguo 26/04/2006, 13:21
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
La funcion lee por linea, así que haces un contador y empiezas a escribir en el array cuando el contador llegue a 2, fácil no?
  #7 (permalink)  
Antiguo 26/04/2006, 14:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pero tu archivo origen lo puedes abrir en texto plano (con "notepad" o cualquier editor de texto plano) y se vé su texto legible?. Ya has mirado que obtienes en $data[algun campo] ? antes de pasar por tus trim y tus utf8_encode()?

Debes revisar todo eso .. recuerda que nosotros (los que pretendemos ayudarte) no disponemos ni de ese archivo ni de las mismas condicones (configuración de tu servidor .. etc) que en tus pruebas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 26/04/2006, 14:20
 
Fecha de Ingreso: abril-2005
Ubicación: colombia
Mensajes: 242
Antigüedad: 19 años
Puntos: 0
mi archivo es de excel es .xls y no entiendo porque me dices que lo abra en notepad, y ya imprimi el valor de data[0] y imprime lo mismo simbolos raros, que sera?????????

Claudio podrias darme un ejemplo no te entiendo que pena
__________________
:aplauso: Ivomat
  #9 (permalink)  
Antiguo 26/04/2006, 14:24
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
No puedes leer un excel tal como está, el formato no responde a lo que es capaz de leer fgetcsv() u otra funcion de ese estilo. Existe la clase COM que permite leer un archivo excel entre otras cosas, tal como si lo hicieras de visual basic. Ver: www.php.net/manual/es/ref.com.php
  #10 (permalink)  
Antiguo 26/04/2006, 14:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por ivomat
mi archivo es de excel es .xls y no entiendo porque me dices que lo abra en notepad, y ya imprimi el valor de data[0] y imprime lo mismo simbolos raros, que sera?????????

Claudio podrias darme un ejemplo no te entiendo que pena
NO sé por qué piensas que el archivo que genera un .xls con Excel ha de ser tal cual lo ves cuando lo abres con Excel. Por eso te proponía la simple prueba de abrir ese archivo .xls con el "notepad" .. por que PHP y sus funciones de trabajo de archvios hacen eso exactamente .. lo abren como si fuera el "notepad".

Si no quieres complicarte .. de Excel .. exporta ese archivo a formato CSV!!! .. pero Exportandolo (o guardando como ....) así ahí tendrás tu formato CSV standar (y mira lo que generó para que veas los separadores de campos y registros .. además de delimitadores de los mismos).

Como acotación .. El uso de COM como menciona claudiovega te limita a usar PHP bajo windows (y tener instalado el "office" en dicho PC que haga las de "servidor") .. En general una solución así no hace para nada el código "portable" (por si desarrollas en "casa" en Windows y luego lo subes todo a un servidor bajo Linux como suele pasar mucho).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 26/04/2006, 15:13
 
Fecha de Ingreso: abril-2005
Ubicación: colombia
Mensajes: 242
Antigüedad: 19 años
Puntos: 0
alguno de ustedes a podido insertar cada columna del archivo de excel a un a columna en una base de datos com "PHP Excel Reader", lo estoy intentando pero este genera una cadena con toda la fila del archivo como hago para dividir eso en cada columna y poderlo inrsetar,.


gracias
__________________
:aplauso: Ivomat
  #12 (permalink)  
Antiguo 26/04/2006, 15:42
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
Al ver los datos que te entrega esta aplicación notas que existe algun caracter separador entre columnas? Si existe, puedes usar explode() y asi separar. Ver: http://www.php.net/manual/es/function.explode.php
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 17:14.