es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lea un archivo de texto en Javascript y cuente la cantidad de veces que aparece cada palabra.

Estoy dejando esta respuesta aquí porque me llevó más de una hora resolverla y espero poder ayudar a cualquiera que esté buscando una respuesta similar.

La pregunta tiene varias partes que se responden en publicaciones separadas de SO:

  1. Leer un archivo de texto en javascript
  2. Analizar el texto para obtener una cadena delimitada por espacios, excluyendo caracteres especiales, pestañas, nuevas líneas, etc.
  3. Contar el número de cada palabra
  4. Mostrar una lista en orden descendente.
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Leyendo un archivo de texto en JavaScript

    Para leer un archivo de texto en JavaScript, podemos utilizar el objeto FileReader. Primero, necesitamos crear un elemento de entrada y adjuntar un evento onchange a él:

    <input type="file" id="myFileInput" onchange="onFileSelected()">
    

    En la función onFileSelected, podemos obtener el archivo seleccionado y crear un objeto FileReader:

    function onFileSelected() {
      const input = document.getElementById("myFileInput");
      const file = input.files[0];
    
      const reader = new FileReader();
      reader.readAsText(file);
    
      reader.onload = function() {
         const fileContent = reader.result;
         // Hacer algo con el contenido del archivo
      };
    }
    

    El método readAsText ordena al objeto FileReader leer el archivo como texto. El método onload se llama cuando el archivo se ha cargado, y la propiedad result del objeto FileReader contiene el contenido del archivo.

    Analizando el texto

    Una vez que tengamos el contenido del archivo, podemos analizarlo para obtener una cadena delimitada por espacios y excluir caracteres especiales, tabuladores, saltos de línea, etc. Podemos utilizar expresiones regulares para esto:

    const cleanContent = fileContent.replace(/[^\w\s]/gi, '').replace(/(\r\n|\n|\r)/gm, " ").toLowerCase();
    

    El primer método replace elimina todos los caracteres que no sean palabras ni espacios, y el segundo método replace reemplaza todos los caracteres de salto de línea con espacios. El método toLowerCase convierte todos los caracteres en minúsculas.

    Contando las palabras

    Para contar el número de cada palabra, podemos crear un objeto donde las claves sean las palabras y los valores sean el número de veces que aparece la palabra en el texto:

    const words = cleanContent.split(" ");
    const wordCount = {};
    
    for (let i = 0; i < words.length; i++) {
      if (words[i] in wordCount) {
        wordCount[words[i]]++;
      } else {
        wordCount[words[i]] = 1;
      }
    }
    

    Primero dividimos la cadena cleanContent en un arreglo de palabras. Luego recorremos las palabras y o bien incrementamos el recuento para una palabra existente o agregamos un nuevo par clave-valor para una nueva palabra.

    Mostrando la lista en orden descendente

    Para mostrar la lista en orden descendente, podemos ordenar las claves por sus valores:

    const sortedWords = Object.keys(wordCount).sort(function(a, b) {
      return wordCount[b] - wordCount[a];
    });
    
    for (let i = 0; i < sortedWords.length; i++) {
      console.log(sortedWords[i] + ": " + wordCount[sortedWords[i]]);
    }
    

    Primero obtenemos las claves del objeto wordCount utilizando el método Object.keys. Luego ordenamos las claves por sus valores utilizando una función de ordenamiento personalizada que devuelve la diferencia entre los valores de las dos claves. Finalmente, recorremos las claves ordenadas y mostramos la palabra y su recuento.

    En general, el código se ve así:

    function onFileSelected() {
      const input = document.getElementById("myFileInput");
      const file = input.files[0];
    
      const reader = new FileReader();
      reader.readAsText(file);
    
      reader.onload = function() {
         const fileContent = reader.result;
         const cleanContent = fileContent.replace(/[^\w\s]/gi, '').replace(/(\r\n|\n|\r)/gm, " ").toLowerCase();
    
         const words = cleanContent.split(" ");
         const wordCount = {};
    
         for (let i = 0; i < words.length; i++) {
           if (words[i] in wordCount) {
             wordCount[words[i]]++;
           } else {
             wordCount[words[i]] = 1;
           }
         }
    
         const sortedWords = Object.keys(wordCount).sort(function(a, b) {
           return wordCount[b] - wordCount[a];
         });
    
         for (let i = 0; i < sortedWords.length; i++) {
           console.log(sortedWords[i] + ": " + wordCount[sortedWords[i]]);
         }
      };
    }
    

    Este código lee un archivo de texto, lo limpia, cuenta las palabras y muestra la lista en orden descendente.

Comments are closed.