Foros del Web » Programando para Internet » PHP »

Carga de CSV

Estas en el tema de Carga de CSV en el foro de PHP en Foros del Web. Hola a todos, tengo una pequeña dudita y es que estoy cargando unos datos desde Excel con un archivo CSV pero no se por alguna ...
  #1 (permalink)  
Antiguo 11/04/2011, 15:18
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Carga de CSV

Hola a todos, tengo una pequeña dudita y es que estoy cargando unos datos desde Excel con un archivo CSV pero no se por alguna razon me salen algunos archivos asi :
"Horas Hombre
"
No se si eso es un espacio o un salto de linea en todo caso la base de datos los guarda asi de esa manera por locual no puedo comparar con "Horas Hombre" ya que no son iguales, trate de coregir esto con el str_replace, pero no funciono no se si es poque no es un espacio, por favor una manito.

Gracias.
  #2 (permalink)  
Antiguo 11/04/2011, 16:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Carga de CSV

¿tu ves un espacio o un salto de linea?

porque vamos, hay que usar el sentido común también... si en la primer linea abre con unas comillas, luego hay texto, y en alguna linea mas adelante cierra las comillas, ¿crees que es un espacio o un salto de linea?

bueno... independientemente de esto puedes usar trim() para eliminar dichos caracteres...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/04/2011, 06:22
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Carga de CSV

Oye mira lo que pasa es que el archivo de excel el cual es subido atravez de php tiene lo siguientes datos Horas Hombre y Cantidad produccion Kg, por alguna razon excel rellena la celda con esapacion o saltos de lineas no lo se con seguridad pero hace que el primer dato sea iguan en tamaño que el segundo, y si has hecho un trabajo de eso sabes que si copias el dato desde la celda directamente se ve asi "Cantidad produccion Kg
" las comillas simplemente se las puese para que se vea el problema, no creas que soy tan novato para saber que si abro comillas hay que cerrarlas.
  #4 (permalink)  
Antiguo 12/04/2011, 08:28
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 3 meses
Puntos: 288
Respuesta: Carga de CSV

hola,
no pasa por hay, sino que las comillas puden son los limitadores del cvs

mostranos una linea de como cargas un registro en php para csv
  #5 (permalink)  
Antiguo 12/04/2011, 08:57
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Carga de CSV

Este es el codigo que se encarga de subir el archivo:

$f = fopen ($nombre, "r");
$ln= 0;
$j=0;
while ($line= fgets ($f)) {
++$ln;
//printf ("%2d: ", $ln);
$line= str_replace(",",".",$line);
$datos[$j]=split(";", $line);
//$datos=$file($line);
/*for($i=count($datos);$i>0;$i--){
echo $datos[$i];
}*/
/*if ($line==FALSE) print ("FALSE\n");
else print ($line);*/
$j++;
//$i++;
}
//exit;
//print_r($datos);exit;
$i=0;
$k=0;
$identificador=array();


/*while($db->next_record()){
$identificador[$i]=$db->f("cod_desc_departamento");
$i++;
}*/
//echo($identificador);
for($j=0;$j<count($datos);$j++){
//$i=0;
$concepto=$datos[$j][0];
$centro_productivo=strtoupper($datos[$j][1]);
$codigo_cc=$datos[$j][2];
$centro_costo=$datos[$j][3];
$valor=$datos[$j][4];
$inductor=$datos[$j][5];
//echo($codigo);exit;
//echo("pruebas");exit;
$db->query("select * from cargar_gastos where concepto='$concepto' and area='$centro_productivo' and codigo_cc=$codigo_cc and centro_costo='$centro_costo' and mes='$mes' and ano='$ano'");
if($db->next_record()){
$db->query("update cargar_gastos set valor=$valor, inductor='$inductor' where concepto='$concepto' and area='$centro_productivo' and codigo_cc=$codigo_cc and centro_costo='$centro_costo' and mes='$mes' and ano='$ano'");
}else{

$db->query("select max(id_gasto)as maxid from cargar_gastos");
if($db->next_record()){
$maxid=$db->f("maxid")+1;
}
$db->query("insert into cargar_gastos(id_gasto,concepto,area,codigo_cc,cen tro_costo,valor,mes,ano,inductor)values($maxid,'$c oncepto','$centro_productivo',$codigo_cc,'$centro_ costo',$valor,'$mes','$ano','$inductor')");
}
}
$bandera=true;
}

if($bandera==true){

echo"<br> Los Gastos han sido cargados satisfactoriamente";
}else{
echo"<br> Los Gastos no han sido cargados";
}

El dato en el que tengo problemas se llama inductor.
  #6 (permalink)  
Antiguo 12/04/2011, 09:28
Avatar de tury3001  
Fecha de Ingreso: abril-2011
Mensajes: 7
Antigüedad: 13 años
Puntos: 2
Respuesta: Carga de CSV

Necesitas un editor hexadecimal para ver qué tipo de caracteres vienen en el CSV antes de hacer cualquier tipo de parseo o separación de datos. Con un editor hexa vas a poder ver claramente esos espacios raros del archivo a ver si son saltos de línea y qué tipos de saltos son, ya que hay tres clases por lo menos. Luego, identificar el código ASCII y ahí decidir qué hacer en el parseo o separación de datos en tu script PHP.
  #7 (permalink)  
Antiguo 12/04/2011, 13:16
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Carga de CSV

oye perdona mi inorancia pero donde se encuentra eso y mejor aun como lo utilizo, biendo los datos me doy cuenta de que si es un salto de linea ya que es ultimo dato de la linea, pero como hago para desaparcer eso que me quede el dato asi: "Horas Hombre"

Ya que se manejar el str_replace, pero no se como se mostraria un saldo de linea en el str_replace.

Gracias.
  #8 (permalink)  
Antiguo 12/04/2011, 14:00
Avatar de tury3001  
Fecha de Ingreso: abril-2011
Mensajes: 7
Antigüedad: 13 años
Puntos: 2
Respuesta: Carga de CSV

Trataré de resumirte un poco el asunto. Los archivos de texto, ya sean .txt o .csv están formados por caracteres. Ahora bien, cada caracter se corresponde con un código hexadecimal que puedes encontrar en la tabla ASCII (http://www.asciitable.com/). Por ejemplo, el espacio es el 20 en hexadecimal y la letra K es el 4B.

Con un editor hexadecimal vas a poder abrir tu archivo .csv y te mostrará de un lado (el derecho generalmente) tu archivo de texto o algo muy parecido a lo que ves si lo abres con algún procesador de textos. Del otro lado, te mostrará una matriz con los códigos hexadecimales asociados a ese texto. Ver esos caracteres raros asusta a cualquiera, pero tranquilo que es fácil. Si seleccionas de un lado, también lo hace del otro mostrandote las correspondencias entre caracteres y códigos.

Entonces, mi idea es que busques en el lado donde ves el texto el lugar donde está el posible salto de línea y lo selecciones. Verás que del lado de los códigos hexadecimales se te seleccionará uno o tal vez más. Luego puedes buscar en la tabla ASCII a qué corresponden esos códigos.

Este es un enlace a un editor hexa, tal vez te pueda servir.
[URL="http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm"]http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm[/URL]

También puedes ver que PHP incorpora las funciones chr() y ord() que sirven para convertir de número ASCII a caracter y viceversa. Ten en cuenta, eso sí, que estas dos funciones usan números decimales y NO HEXADECIMALES . Tal vez con ord() puedas identificar el caracter, ver si es un fin de línea y actuar en consecuencia.

Espero que mi explicación no te haya confundido.

Cuentame como te fue!
Saludos!
  #9 (permalink)  
Antiguo 14/04/2011, 07:33
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Carga de CSV

Hola tury3001 ya hize lo que me has dicho y tienes toda la razon es un salto de linea con un espacio mira estos dos numeros corresponde a lo que me ha salido con el editor:
0D pero corresponde a solo D y ensegida me sale 0A que corresponde a un salto de linea.

Pero apesar de tener el manual de php no entiendo como quitarle el salto de linea y ese espacio que aparecen ahi.

se me ocurrio esta idea:
str_replace(ord(10),"",$linea);

pero eso no funciona, perdona mi novatada pero podrias ayudarme a quitarle esos dos caracteres para que me quede la cadena limpia.

Muchas gracias por la guia tan util.
  #10 (permalink)  
Antiguo 14/04/2011, 22:25
Avatar de tury3001  
Fecha de Ingreso: abril-2011
Mensajes: 7
Antigüedad: 13 años
Puntos: 2
Respuesta: Carga de CSV

Ese es el fin de línea que usa el sistema operativo Windows. Se trata de un CR (Carriage Return) seguido de un LF (Line Feed).
Te voy a dejar un código de ejemplo que probé y funciona para filtrar estos dos caracteres.

Código PHP:
Ver original
  1. <?php
  2.  
  3. DEFINE('RUTA','texto.txt');
  4.  
  5. $arch = fopen(RUTA,'r');
  6.  
  7. $texto = array();
  8.  
  9. while (!feof($arch)) {
  10.     $linea = fgets($arch);
  11.    
  12.     $str1 = (string) chr(101);
  13.     $str1 = (string) chr(65);
  14.    
  15.     $linea_nueva = str_replace(chr(13),'X',$linea);
  16.     $linea_nueva = str_replace(chr(10),'X',$linea_nueva);
  17.    
  18.     $texto[] = $linea_nueva;
  19.    
  20. }
  21.  
  22. fclose($arch);
  23.  
  24. print_r($texto);
  25.  
  26. ?>

Como ves, deberías usar chr para convertir los códigos decimales en caracteres. El ejemplo lee un archivo de texto, como tu csv por líneas y luego filtra esos dos caracteres. Cuidado porque estoy poniendo una X en lugar de un espacio ' '. Lo hice para que puedas ver que realmente los está encontrando y reemplazando. Si corres el ejemplo verás que muestra todo en una línea y que al final de lo que antes era una línea ahora pone XX. En tu caso claro, deberás poner ' '.

Espero que sirva de ayuda.

Saludos!
  #11 (permalink)  
Antiguo 15/04/2011, 08:01
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Carga de CSV

Mil gracias por la ayuda, gracias ti este novato ha salido de la oscuridad.

hermano que pena molestarte pero parece que sabes bastante de php tu has manejado el PHPExcel para generar archivos de excel desde php, si es asi tengo una preguntita para ti.

Yo tengo que hacer un reporte que tiene unos datos de la base de datos pero aunque ya puedo crear el archivo de excel tengo un problema y es que no puedo hacer que las celdas se generen automaticamente tengo que ponerle todo asi :

->setCellValue('A1', 'Base Produccion x Mes')

Pero necesito por der hacer que el 'A' sea automatico que puede segir la secuencia sin tener que ponerme a hacer todo asi:

->setCellValue('A1', 'Base Produccion x Mes')
->setCellValue('B1', 'Base Produccion x Mes')
->setCellValue('C1', 'Base Produccion x Mes')

por fa si sabes como dame una mano, ya he leido todos los documentos y visto todos los ejemplos pero nada que me sale lo que necesito.
  #12 (permalink)  
Antiguo 15/04/2011, 08:34
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 3 meses
Puntos: 155
Respuesta: Carga de CSV

intenta usar este metodo

Código PHP:
<?
#columna y renglon son numericos
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($columna$renglon,$valor);

?>
  #13 (permalink)  
Antiguo 15/04/2011, 10:47
Avatar de Sougiro  
Fecha de Ingreso: octubre-2007
Mensajes: 136
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Carga de CSV

Muchas gracias a todos, han sido de mucha ayuda para sacar a este novato de la oscuridad, el codigo que me acabas de dar es lo que necesitaba con el puedo hacer todas las columnas y filas de forma automaticas.

Gracias chicos, sois geniales

Etiquetas: carga, csv
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 09:04.