Ferramentas de CSV

Ferramentas de processamento de CSV.

by Rui Leite

HTML

<h1>Ferramentas de CSV</h1>
<p>
  URL do Fiddle:
  <a href="http://jsfiddle.net/ruipimentel/v0b3bu41/" target="_blank">Ferramentas de CSV</a>
</p>
<hr />
<p>
  Cole o CSV abaixo. A primeira linha deve ser de títulos.
</p>
<p class="formulario">
  <textarea id="csv" class="text">   	SETORCODNR	UNIDCODNR
13	41	12
12	9	13</textarea><br />
  <span>
    <label for="delimitador_coluna">Delimitador de coluna:</label>
    <input id="delimitador_coluna" type="text" value="\t" size="5" />
  </span>
  <br />
  <span>
    Formato de saída:
    <input id="formato_saida_par_nome_valor"
         name="formato_saida"
        value="par_nome_valor"
         type="radio"
      checked="checked"
    />
    <label for="formato_saida_par_nome_valor">Par Nome/Valor</label>
    <input id="formato_saida_insert"
         name="formato_saida"
        value="insert"
         type="radio"
    />
    <label for="formato_saida_insert">INSERT</label>
    <input id="formato_saida_js_params"
         name="formato_saida"
        value="js_params"
         type="radio"
    />
    <label for="formato_saida_js_params">js_params</label>
    <input id="formato_saida_json"
         name="formato_saida"
        value="json"
         type="radio"
    />
    <label for="formato_saida_json">JSON</label>
  </span>
  <br />
  Demais opções:
  <span>
    <input id="ignorar_primeira_coluna" type="checkbox" checked="checked" />
    <label for="ignorar_primeira_coluna">Ignorar 1ª coluna</label>
  </span>
  <span>
    <input id="alinhar_resultado" type="checkbox" checked="checked" />
    <label for="alinhar_resultado">Alinhar resultado</label>
  </span>
  <br />
  <span>
    <button id="converter">Processar</button>
    <button id="baixar">Processar e baixar</button>
  </span>
  <br />
  <textarea id="resultado" class="text"></textarea>
</p>
<hr />
<p>
  Baseado em:
  <a href="http://jsfiddle.net/sturtevant/vUnF9/" target="_blank">JSON to CSV Converter</a>
</p>

CSS

body { padding: 5px 10px; }
hr { margin: 20px 0; }
p { margin: 10px 0; }
h1 { font-size: x-large; font-weight: bold; }
p.formulario span { display: inline-block; margin: 5px 10px 5px 0; }
textarea { width: 99%; height: 200px; }
input { margin-left: 10px; }

JavaScript

function rpad(str_inicial, str_preench, tamanho){
	var str = str_inicial;
	while(str.length < tamanho) str += str_preench;
  return str;
}

function paraArray(strData, delimitador_coluna){
	var arrData = strData.split("\n");
  arrData = arrData.filter(function(str){
  	return !str.match(/^\s*$/);
  });
  arrData = arrData.map(function(str){
  	return str.split(eval("\"" + delimitador_coluna + "\""));
  });
  return (arrData);
}

function processar(){
	
  // Recupera dados do formulário:
  var csv = $("#csv").val();
  var delimitador_coluna = $("#delimitador_coluna").val();
  var formato_saida = $("input[name=formato_saida]:checked").val();
  var ignorar_primeira_coluna = $("#ignorar_primeira_coluna").is(":checked");
  var alinhar_resultado = $("#alinhar_resultado").is(":checked");
  var csv_tem_aspas = $("#csv_tem_aspas").is(":checked");
  
  // Obtém um array a partir dos dados do csv:
  var array = paraArray(csv, delimitador_coluna);
  
  // Extrai estatísticas a partir do array:
  var tamanho_maior_titulo = array[0].reduce(function(hist, atual){
  	return Math.max(hist, atual.length);
  }, 0);
  var tamanho_maior_valor = array.map(function(arr){
  	return arr.reduce(function(hist, atual){
    	return Math.max(hist, atual.length);
    }, 0);
  }).slice(1).reduce(function(hist, atual){
  	return Math.max(hist, atual);
  }, 0);
  var tamanho_maior_ultima_coluna = array.map(function(arr){
  	return arr[arr.length - 1].length;
  }).reduce(function(hist, atual){
  	return Math.max(hist, atual);
  }, 0);
  
  // Converte para o formato selecionado:
  var str;
  switch(formato_saida){
  	
    /*************
    PAR NOME/VALOR
    *************/
  	case "par_nome_valor":
    	str = rpad("", "-", tamanho_maior_titulo + 2 + tamanho_maior_valor) + "\n";
      for(var l = 1; l < array.length; l++){
      	for(var c = (ignorar_primeira_coluna ? 1 : 0); c < array[l].length; c++){
          str += rpad(array[0][c], " ", alinhar_resultado ? tamanho_maior_titulo :...