Cómo contar la repetición de elementos en una lista, online
En ocasiones pienso que existe en Internet una herramienta para cada problema que necesitamos resolver ["está todo inventado", solía decir mi abuelo]. Aunque posiblemente estoy exagerando, mi experiencia me dice que 8 de cada 10 veces que busco una herramienta online para hacer algo especifico, ésta existe.
Hoy te voy a mostrar una de esas herramientas que, en principio, te puede parecer que resuelve un problema anodino pero, sin embargo, como somos tantos de nosotros es muy probable alguien haga uso de la misma.
Tabla de contenidos
Contar elementos repetidos en una lista
Si manejas alguno de los cientos de lenguajes de programación que existen posiblemente te tomes el tiempo para copiar y pegar crear un programa que cuente los elementos repetidos en una lista. Si sos el rey de Excel o Google Sheets [dale una mirada a Libre Office que vale la pena], es muy probable que puedas resolver el problema de contar repetidos con alguna formula loca o similar.
Pero, si no podes hacer nada de lo mencionado en el párrafo anterior, o podes pero no queres ocupar tu tiempo en eso, entonces, y solo entonces, quizás esta herramienta es para vos:
La herramienta hace lo que dice que hace. Por ejemplo, si tenemos la siguiente lista [Siempre me fue imposible memorizar el abecedario, no sé porque]:
A
B
C
D
E
F
G
H
I
J
K
M
N
L
O
P
Q
R
S
A
Y la copiamos en el textarea del sitio web Contar la repetición de elementos en una lista.
Nos va mostrar como resultado algo como lo siguiente:
Sencillo y funcional. Te dice cuantas repeticiones hay para cada elemento de la lista.
El resultado también se puede exportar en formato CSV, que puede a ser importado y procesado con Excel, Google Sheets o Libre Office.
¿Qué pasa si mi lista contiene información sensible?
Es una buena pregunta y supongo un escenario de uso valido. Respecto a eso, en el sitio se menciona lo siguiente:
"Los datos introducidos en el formulario anterior se procesan del lado del cliente en su navegador web, y nunca se envían o almacenan en ningún otro lugar aparte de su dispositivo."
Y efectivamente comprobamos que así funciona, dado que al momento de presionar el botón "Display/Update Counts" no se envía ningún request al servidor, sino que se invoca a la función updateCounts()
encargada de procesar la lista y retornar el resultado.
Es más, esa función está embebida en un tag script
dentro del HTML:
var objCountsPlaceholder = null;
function updateCounts()
{
formObj = document.forms['lineCounts'];
textInput = formObj.elements['textInput'];
objCountsPlaceholder = document.getElementById('CountsPlaceholder');
// Index 0 is the count, 1 is the line
sortByIndex = 0;
if(document.getElementById('sortby_line').checked)
{
sortByIndex = 1;
}
formatSelection = 'readable';
if(document.getElementById('format_csv').checked)
{
formatSelection = 'csv';
}
inputString = new String(textInput.value);
var arrLines = inputString.split("\n");
var countLines = arrLines.length;
var arrUniqueLines = [];
// Loop through lines and accumulate counts
for(var i = 0; i < countLines; i++)
{
// Ignore trailing new-line (if there is one)
var currentLine = arrLines[i];
if(currentLine.substr(currentLine.length - 2, 2) == "\r\n")
{
currentLine = currentLine.substr(0, currentLine.length - 2);
}
if(currentLine.substr(currentLine.length - 1, 1) == "\n" ||
currentLine.substr(currentLine.length - 1, 1) == "\r")
{
currentLine = currentLine.substr(0, currentLine.length - 1);
}
// Count the lines
if(!arrUniqueLines[currentLine]) {
arrUniqueLines[currentLine] = 1;
} else {
arrUniqueLines[currentLine] += 1;
}
}
// Delete the counts from previous run
if(objCountsPlaceholder.hasChildNodes())
{
while(objCountsPlaceholder.childNodes.length >= 1)
{
objCountsPlaceholder.removeChild(objCountsPlaceholder.firstChild);
}
}
if(formatSelection == 'csv')
{
AppendLine("COUNT,LINE");
}
else
{
AppendLine("COUNT | LINE");
AppendLine("-----------------------------------------------------");
}
// Sort by count
var sortedLines = [];
for(var i in arrUniqueLines)
{
sortedLines.push([arrUniqueLines[i], i]);
}
arrUniqueLines = null;
// Reverse sort by count
sortedLines.sort(function(a,b) {
if(sortByIndex == 0)
{
return (b[0] - a[0] != 0 ? b[0] - a[0] : a[1].localeCompare(b[1]));
}
else
{
return (a[1].localeCompare(b[1]) != 0 ?a[1].localeCompare(b[1]) : b[0] - a[0]);
}
} );
// Print the line counts
for(var i in sortedLines)
{
if(formatSelection == 'csv')
{
AppendLine(sortedLines[i][0] + ',"' + sortedLines[i][1].replace('"', '""') + '"');
}
else
{
strToPrint = '' + zeroPad(sortedLines[i][0], 8, " ");
strToPrint += ' | ' + sortedLines[i][1] + '';
AppendLine(strToPrint);
}
}
// Print total character count
if(formatSelection == 'csv')
{
AppendLine(countLines + ",TOTAL LINES");
}
else
{
AppendLine("-----------------------------------------------------");
AppendLine(zeroPad(countLines, 8, " ") + " | TOTAL LINES");
}
return false;
}
// n = number you want padded
// digits = length you want the final output
function zeroPad(n, digits, padChar) {
n = n.toString();
while (n.length < digits) {
n = padChar + n;
}
return n;
}
function AppendLine(str)
{
objCountsPlaceholder.appendChild(document.createTextNode(str + "\n"));
}
Si te gusta como se ve el código podes hacer lo mismo usando un resaltador de sintaxis online
El resumen, el saludo y la despedida
No hay mucho más que decir. La herramienta cumple lo que promete: contar los elementos repetidos en una lista. Punto. Si necesitas resolver ese problema, puede ser un buen candidato para que pongas esa página en tus bookmarks [y si es en Vivaldi mucho mejor]
Como tenemos la costumbre de agradecer a los creadores de estás utilidades, vamos a saludar y darle las gracias a Shailesh N. Humbad, el desarrollador detrás de esta herramienta y muchas otras que vas a poder encontrar en su muy elegante sitio web: Somacon.
Estamos en Twitter, aunque parecer que nadie lo sabe: https://twitter.com/tecnolocuras1 🦆
¡Nos vemos! Peace. ✌
/ Súmate al boletín. No es gran cosa, pero es gratis 👇 /