0

我正在使用 Papa.unparse() 将 JSON 对象转换为 csv,然后下载文件。该方法失败:

“分配大小溢出 papaparse.min.js:6:1580”

当 JSON 数组中有超过 500,000 个要解析的项目时,会在 Firefox 中发生这种情况。

Papa.parse() 方法允许您从文件中流式传输数据。您可以对 Papa.unparse() 采取任何类似的方法吗?

4

1 回答 1

0

您不需要 PapaParse 来执行此操作。

分配大小溢出问题是将 500,000 行转换为 500,000 个字符串,然后将它们连接在一起形成一个巨大的字符串来创建 CSV 文件。当您将一个或多个字符串连接在一起时,JavaScript 会创建一个新字符串,最终您会耗尽内存并崩溃。

解决方案是使用 TextEncoder 将您的字符串编码为 utf-8(或任何您需要的)ArrayBuffers,将每个字符串推送到一个巨大的数组中,然后使用该数组创建您的文件。

以下是一些关于如何执行此操作的粗略代码:

var textEncoder = new TextEncoder("utf-8");
var headers = ["header1","header2","header3"];
var row1 = ["column1-1","column1-2","column1-3"];
var row2 = ["column2-1","column-2-2","column2-3"];
var data = [headers,row1,row2];
var arrayBuffers = [];
var csvString = '';
var encodedString = null;
var file = null;

for(var x=0;x<data.length;x++){
  csvString = data[x].join(",").concat('\r\n');
  encodedString = textEncoder.encode(csvString);
  arrayBuffers.push(encodedString);
}

file = new File(arrayBuffers,"yourCsvFile.csv",{ type: "text/csv" });

我对 TextEncoder polyfill 使用文本编码,并且大概如果您尝试 Papa.unparse 您已经有了 FileAPI。

于 2015-08-04T05:00:55.123 回答