1

Soy algo nuevo en javascript y quizas me estoy complicando mucho, he creado una función que me crea un json de un csv, es una tarea de mi universidad por lo que no pude usar librerías externas para crearlo, pero no puedo actualizar el json que sale de resultado, no se si es posible retornarlo o si me estoy equivocando en algo, espero que puedan ayudarme porque ya llevo algo atrasada esta asignación y no me permite avanzar por este problema.

 let file = e.target.files[0];
      let reader = new FileReader();
      let nombre = file.name.split('.');
      this.setState({operationInProgress: true, fileLoadProgress: 0, fileLoaded:true, fileName:file.name, tipo:nombre[1]}, 
        ()=>{});
      reader.onload = function (e) {
        let data = new Uint8Array(e.target.result);
        let json = "";
        if (file.name.endsWith('.csv')) {
          
          let decoder = new TextDecoder();
          let texto = decoder.decode(data);
          let lines = texto.split('\n');
          let lineaH = lines[0].split("\n");
          let headers = lineaH[0].split(",")
          json = "["
          for (let index = 1; index < lines.length; index++) {
            const element = lines[index];
            json += "{";
            let objeto = element.split(',');
            
            for (let j = 0; j < objeto.length; j++) {
              if (j < objeto.length-1) {
                json += `"${headers[j].trim()}" : "${objeto[j].trim()}",`;  
              }else{
                json += `"${headers[j].trim()}" : "${objeto[j].trim()}"`;   
              }
            }
            if (index < lines.length-1) {
              json += "},";
            }else{
              json += "}";  
            }
            
          }
          //Este valor quiero retornar
          json += "]";
          
          
        }
Gerardo
  • 31
  • 1
  • Tu problema es similar a [éste otro](https://es.stackoverflow.com/questions/1539/c%c3%b3mo-obtener-la-respuesta-de-una-llamada-as%c3%adncrona-ajax-fuera-de-ella). Creo que te puede resultar útil que le eches un vistazo – Pablo Lozano May 04 '21 at 07:30
  • Por otro lado, bienvenido a SOes, te recomiendo completar el [tour] de bienvenida y, aunque esta pregunta me parece bien planteada y expuesta, nunca viene mal leer [ask] – Pablo Lozano May 04 '21 at 07:32

1 Answers1

0

Encontré la solución simplemente cree otra variable que me guardaba el this

 try {
      let file = e.target.files[0];
      let reader = new FileReader();
      let this2 = this; //Cree esta variable
      let nombre = file.name.split('.');
      this.setState({operationInProgress: true, fileLoadProgress: 0, fileLoaded:true, fileName:file.name, tipo:nombre[1]}, ()=>{});
      
      reader.onload = function (e) {
        let data = new Uint8Array(e.target.result);
        let json = "";
        
        if (file.name.endsWith('.csv')) {
          
          let decoder = new TextDecoder();
          let texto = decoder.decode(data);
          let lines = texto.split('\n');
          let lineaH = lines[0].split("\n");
          let headers = lineaH[0].split(",")
          json = "["
          for (let index = 1; index < lines.length; index++) {
            const element = lines[index];
            json += "{";
            let objeto = element.split(',');
            
            for (let j = 0; j < objeto.length; j++) {
              if (j < objeto.length-1) {
                json += `"${headers[j].trim()}" : "${objeto[j].trim()}",`;  
              }else{
                json += `"${headers[j].trim()}" : "${objeto[j].trim()}"`;   
              }
            }
            if (index < lines.length-1) {
              json += "},";
            }else{
              json += "}";  
            }
            
          }
          json += "]";
          
        }else if (file.name.endsWith('.xlsx')) {
          let dataset = [];
          let workbook = XLSX.read(data, { type: "array" });
          for (let index = 0; index < workbook.SheetNames.length; index++) {
            const element = workbook.SheetNames[index];
            let worksheet = workbook.Sheets[workbook.SheetNames[index]];
            let sheet = XLSX.utils.sheet_to_json(worksheet, { header: 0 });
            
            let hoja = {
              hoja: element,
              datos: sheet
            }
            dataset.push(hoja);
          }
          json = JSON.stringify(dataset);
        }
        this2.setState({ //La mande a llamar aquí para guardar los datos
          data: json
        });
      }
      
      reader.readAsArrayBuffer(file);
Gerardo
  • 31
  • 1