Mostrando entradas con la etiqueta php. Mostrar todas las entradas
Mostrando entradas con la etiqueta php. Mostrar todas las entradas

miércoles, 16 de octubre de 2019

Cargar CSV en JavaScript

Cargar y leer un archivo csv en JavaScript sin necesidad de php, java u otro más.

Así es, tal y como lo leen, hoy les traigo un código que espero les ayude tanto como a mi me a ayudado hasta este momento, con un poco de lógica, que les dejara como resultado el contenido del archivo en un array.

Y como siempre lo digo... vamos al punto.

<div id="drop_file_zone" ondragover="return false" ondrop="upload_file(event)">
 <div id="drag_upload_file">
  <div id="datos">
   <h2>
    Drag and drop file here or click for selected file
   </h2>
  </div>
  <input id="selectfile" type="file" />
 </div>
</div>
<div id="dvCSV"></div>
dando como resultado lo siguiente


A esto demos le un poco de estilo.


#drop_file_zone{
 border: solid 1px;
 cursor: pointer;
 }
#drop_file_zone #drag_upload_file{
 height: 3em;
 padding: 1em;
 }
#drop_file_zone:hover{
 border-style: dashed;
 border-radius: 5px;
 border-color: blue;
 }
#drop_file_zone input[type=file]{
 display: none;
 }

Esto quedara así


Ahora lo mas esperado. Así es, el codigo.

Comencemos con las acciones del drop y el evento click a nuestra área de archivo.

---

$( '#drag_upload_file' ).click(function(){
 document.getElementById('selectfile').click();
 document.getElementById('selectfile').onchange = function () {
  uploadCsv( document.getElementById('selectfile').files[0], function(data){
   createTable( data );
  });
 };
});
function upload_file( e ){
 e.preventDefault();
 uploadCsv( e.dataTransfer.files[0], function(data){
  createTable( data );
 } );
}
function uploadCsv( fileUpload, callback ){}
function createTable( datos ){}
---

Con esto, decimos que cuando den click o bien cuando dejen un archivo en nuestra área esta invocará la función uploadCsv, la cual recibe como primer parametro el archivo del file upload mientras que en su segundo parametro deja una funcion de retorno.

Ahora bien el codigo de la funcion uploadCsv es el siguiente.


---

function uploadCsv(fileUpload, callBack) {
 var rtn = {};
 var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv)$/;
 if (regex.test(fileUpload.name.toLowerCase())) {
  rtn.name = fileUpload.name;
  rtn.data = [];
  rtn.size = fileUpload.size;
  rtn.encabezado = [];
  if (typeof (FileReader) != "undefined") {
   var reader = new FileReader();
   reader.onload = function (e) {
    var x = 0;
    var rows = e.target.result.split("\n");
    for (var i = 0; i < rows.length; i++) {
     var cells = rows[ i ].split( "," );
     var obj = {};
     var have = 0;
     for( var j = 0; j < cells.length; j ++ ){
      if( cells[ j ].length == 0 )break;
      have = 1;
      if( i == 0 ){
       obj[ 'field_' + j ] = ( cells[ j ].trim() ).toUpperCase();
      }else{
       var field =  rtn.encabezado[0]['field_' + j ] ;
       obj[ field ] = cells[ j ];
      }
     }
     if( i == 0 ){
      rtn.encabezado.push( obj );
     }else{
      if( have == 1 )
       rtn.data.push( obj );
     }
     x++;
    }
    rtn.total = x ;
    callBack( rtn );
   }
   reader.readAsText(fileUpload);//.files[0]);
  } else {
   callBack( "Este navegador no soporta html5" );
  }
 } else {
  callBack( "El archivo no es csv");
 }
}
---

Ahora solo falta el mostrar el contenido de nuestro archivo, y para ello nos creamos la funcion createTable con lo siguiente,


---

function createTable(datos) {
 var table = document.createElement("table");
 var rows = datos.data;
 var cells = Object.keys( datos.encabezado[ 0 ] );
 for (var i = 0; i < rows.length; i++) {
  var row = table.insertRow(-1);
  for (var j = 0; j < cells.length; j++) {
   var cell = row.insertCell(-1);
   cell.innerHTML = datos.data[i][ datos.encabezado[ 0 ][ cells[ j ] ] ];
  }
 }
 var head = table.createTHead( -1 );
 var row = head.insertRow( -1 );
 for( var j = 0; j < cells.length; j ++ ){
  var th = document.createElement( 'TH' );
  th.innerHTML = datos.encabezado[ 0 ][ cells[ j ] ];
  row.appendChild( th );
 }
 var caption = table.createCaption();
 caption.innerHTML = "
" + datos.name + "";

 var dvCSV = document.getElementById("dvCSV");
 dvCSV.append( table );
}
---

Y así de simple es como queda esto. no sin antes darle un mejor estilo a nuestra tabla creada a partir del contenido del archivo csv.


----

table{
 width: 100%;
 border: 1px;
 border-collapse: collapse;
}
table caption {
 border: solid 1px;
 font-size: larger;
 padding: 0.5em;
}
table thead tr th {
 padding: 0.75em;
 border: solid 1px;
 border-top: none;
 font-size: larger;
}
table tr td {
 border: solid 1px;
 padding: 0.5em;
 font-size: small;
}
----
dejando al final un resultado como el siguiente.


Espero les sirva de apoyo para su desarrollo, sin mas.. me despido por el momento, espero sus comentarios.

martes, 12 de mayo de 2015

Uso de Ajax

Que tal, despues de tanto tiempo acabo de hacer un gran borron y cuenta nueva.

El por que hago esto, bueno, hay que empezar de cero si quieres cambiar...

Esta vez les traigo un ejemplo del uso de AJAX.

Primero que nada, si apenas etas empezando en algun lenguaje de entorno web, te encontraras con diversos ID'S que te facilitarán la edicion de los mismos ejemplo de ello, Sublime-Text, Notpad++, AptanaStudio entre otros, sin embargo les recomiendo que empiecen con alguno que no les brinde mas que el cambio de color en el texto ya que de esa manera agarran la mania de cerrar las llavez y etiquetas.

En el pasado, me encontraba anonadado con el tema de php, sin embargo el uso esclusivo de este lenguaje, te limita a lo propio de si mismo.


Resientemente me encuentro trabajando en el desarrollo de un analizador de ventas a pronostico, en entorno web, y resientemente me encuentro a gusto con las ventajas de AJAX, HTML5, PHP, y Java, todo mesclado en el mismo proyecto, sin embargo el tema no es de lo que estoy haciendo si no mas bien de las ventajas del lenguaje.


Simulando el tener un servicio PHP y un consumidor en HTML5 con jQuery y AJAX.

Para el ejemplo realizaremos una Calculadora, la cual se ejecuta en el lado del cliente y consume un servicio en PHP.


Codigo HTML

----------------------------------------------------------
<br />
<div class="container">
<input id="val1" type="text" />
   <input id="val2" type="text" />
   <button id="btn1">+</button>
   <button id="btn2">-</button>
   <button id="btn3">/</button>
   <button id="btn4">*</button>
   <button id="btn5">err</button>
</div>
<div id="resultado">
</div>
----------------------------------------------------------
Explicando el codigo.

Si mas adelante le quieres dar un estilo, es por ello que se ponen los componentes dentro de un container.

Ambos input seran los que contengan los valores a calcular.

Los buttons llaman a las funciones en jQuery para la ejecucion del codigo.

Codigo jQuery
----------------------------------------------------------
<script>
//inicializamos el documento
$('document').ready(function($) {
 //funcion que es llamada al hacer click en el boton 1
 $('#btn1').click(function(){
  llamado('sumax');
 });
 //funcion que es llamada al hacer click en el boton 2
 $('#btn2').click(function(){
  llamado('restass');
 });
 //funcion que es llamada al hacer click en el boton 3
 $('#btn3').click(function(){
  llamado('dv');
 });
 //funcion que es llamada al hacer click en el boton 4
 $('#btn4').click(function(){
  llamado('mul');
 });
 //funcion que es llamada al hacer click en el boton 5
 //en particular solo es para mostrar que se puede
 //retornar un error
 $('#btn5').click(function(){
  llamado('c');
 });
});
/*
* las funciones anteriores son al hacer click en cada uno de los
* botones, sin embargo todas llaman a una en particular la cual es
* llamado teniendo un parametro el cual indica la operacion que se
* quiere efectuar, funciona para cada una de las operaciones.
*/
function llamado(acciones){

 $.ajax({ url: 'directorio/nombre_de_mi_servicio.php',
 data: {action: acciones,  /*nombre de la accion a efectuar suma,resta,divicion,multiplicacion*/
 val1: $('#valor1').val(), /*Primer valor a evaluar*/
 val2: $('#valor2').val()  /*Segundo valor a evaluar*/
 }, type: 'POST', /*Tipo de peticion que se hace al servicio*/
 beforeSend: function () {
  //Mientras se espera la respuesta del servicio se pone un mensaje
  $("#resultado").html("Trabajando espere...");
 },success: function(vRetorno) {
   //Al resibir un valor devuelto este se agrega al div que lo contendra
   $('#resultado').html(vRetorno);
  }
 });
}
</script>
----------------------------------------------------------
Codigo PHP
----------------------------------------------------------
 //se guarda el valor obtenido del jQuery en variables de tipo PHP
 $action = $_POST['action'];
 $v1 = $_POST['val1'];
 $v2 = $_POST['val2'];
 //se evalua la accion que se quiere calcular
 switch ($action) {
  case 'sumax':
    //se imprime el resultado de la operacion
    echo sumass($v1,$v2);
   break;
  case 'restass':
    //se imprime el resultado de la operacion
    echo restax($v1,$v2);
   break;
  case 'dv':
    //se imprime el resultado de la operacion
    echo divs($v1,$v2);
   break;
 
  case 'mul':
    //se imprime el resultado de la operacion
    echo multiplica($v1,$v2);
   break;
  default:
    //en caso de no coincidir la accion con ningun caso
    //se imprime un error
    echo 'Valor Invalido';
   break;
 }
 //funcion de suma
 //valor retorno el resultado de la suma
 function sumass($val1, $val2){
  $resultado = $val1 + $val2;
  return $resultado;
 }
 //funcion resta
 //retorna el resultado de la resta
 function restax($val1, $val2){
  $resultado = $val1 - $val2;
  return $resultado;
 }
 //funcion divicion
 //retorna el resultado de la divicion
 function divs($val1, $val2){
  //se evalua si el valor 2 es mayor a 0
  //esto para evita rque se tenga que hacer una divicion sobre 0
   if($val2 &gt; 0){
    $resultado = $val1 / $val2;
    return $resultado;
   }else{
    return 'Error al dividir sobre 0';
   }
 }
 //funcion multiplicacion
 //retorna el resultado de la multiplicacion
 function multiplica($val1, $val2){
  $resultado = $val1 * $val2;
  return $resultado;
 }
----------------------------------------------------------

Perdonen por el diseño, pero como les dije parrafos atras, no hablamos de estilos mas que de la funcionalidad del lenguaje.

Por el momento es todo lo que puedo ofrecerles por hoy, sin mas, me despido esperando sus comentarios y que esto les funcione tanto como a mi me ha ayudado.


hasta pronto.