字符串长度 array.join javascript 无效

invalid string length array.join javascript

提问人:bwkam 提问时间:10/23/2023 最后编辑:bwkam 更新时间:10/23/2023 访问量:53

问:

我正在使用 SheetJS 在我的前端读取巨大的 excel 文件,并使用 XLSX.utils.sheet_to_json将它们解析为 JSON。但显然,它超过了 V8 的极限。

在使用小文件进行测试时,它运行良好,但是当使用稍大的文件(大约一百万行)进行测试时,我开始出现上述错误,我还尝试一次对每个元素进行 JSON.stringify,但这仍然会产生相同的错误。我不确定如何规避这样的问题,我想过将JSON转换为二进制文件或将其gzip压缩以POSTing到服务器,但据我所知,这仍然需要对对象进行JSON.stringify。

到目前为止,我拥有的用于字符串化 JSON 的代码。

        const payloadEntries = Object.entries(payload).map(([key, value]) => {
          return `"${key}":[${value
            .map((el) => JSON.stringify(el))
            .join(",")}]`;
        });

有效负载对象如下所示


[
   {

      "A":"2023/23/10 1:19",
      "B":"3",
      "C":"1",
      "D":"3-1",
   }, 

 {

      "A":"2023/23/10 1:19",
      "B":"4",
      "C":"2",
      "D":"4-1",
   }, 

]

编辑:这使用普通的JavaScript,而不是节点。

JavaScript HTML Excel 浏览器 工作表JS

评论


答:

-1赞 Marwi 10/23/2023 #1

JSON.stringify 在处理大型数据结构时会消耗大量内存。

下面是一个示例,说明如何使用 Node.js 从 Excel 文件流式传输数据并将其转换为 JSON:

const XLSX = require('xlsx');
const fs = require('fs');
const JSONStream = require('JSONStream');

const workbook = XLSX.readFile('largefile.xlsx');
const sheetName = workbook.SheetNames[0];
const sheet = workbook.Sheets[sheetName];

const jsonStream = JSONStream.stringify();
const writeStream = fs.createWriteStream('output.json');

jsonStream.pipe(writeStream);

XLSX.stream.to_json(sheet)
  .pipe(jsonStream);

writeStream.on('finish', () => {
  console.log('JSON file has been written');
});

// You can now send the JSON file to your server or process it on the server.

评论

0赞 bwkam 10/23/2023
感谢您的回答,但我忘了提到我在浏览器上使用香草 JS,没有 bunder,所以我没有使用 node。