Json到node.js中的csv

我试图将一个非常大的json转换为node.js中的csv,但它花费了太多的时间,并导致转换时100%的cpu。

jsonToCsv: function (data) { var keys = Object.keys(data[0]); var csv = [keys.join(",")]; console.time("CSVGeneration"); data.forEach(function (row) { var line = ''; keys.forEach(function (key) { if (typeof row[key] === 'string') { row[key] = "" + file_utils.escapeCsv(row[key]) + ""; } line += row[key] + ","; }); csv.push(line); }); console.timeEnd("CSVGeneration"); csv = csv.join("\n"); return csv; }, escapeCsv: function (x) { if (x) return ('' + x.replace(/"/g, '').replace(/,/g, ' ').replace(/\n/g, " ").replace(/\r/g, " ") + ''); else return (''); }, 

在1Lac行的平均运行中,它甚至不会恢复到logging时间。 我不得不手动杀死进程。

有人可以提出一个更好的select吗?

在回答这个问题之前:假设你的代码正在工作,这个问题属于https://codereview.stackexchange.com/

至于你的问题:

  • forEach()这样的新的数组访问函数,在编码时相当舒服,通常不是很高效。 在性能危急的情况下,一个简单的for循环是更好的select。
  • escapeCsv()你申请4个不同的正则expression式replace每个只有一个字符。 将这些合并为一个。
  • 假设数据已经以某种方式构build,允许Csv转换( data是一个对象数组,每个对象具有相同的属性),则不必为每个对象分别检索这些键。

应用此,产生以下代码:

 function escapeCsv(x) { if (x) { return ('' + x).replace( /[",\n\r]/gi, '' ); } else { return (''); } } function jsonToCsv(data) { var keys = Object.keys(data[0]), csv = [keys.join(",")]; var row = new Array( keys.length ); for (var i = 0; i < data.length; i++) { for (var j = 0; j < keys.length; j++) { if (typeof data[i][keys[j]] === 'string') { row[j] = '"' + escapeCsv(data[i][keys[j]]) + '"'; } else { row[j] = data[i][keys[j]] || ''; } } csv.push(row.join(',')); } return csv.join("\n"); } 

根据jsPerf的说法,仅这一项就可以提高约3-5倍的性能。

如果您正在生成的CSV可以直接stream式传输到文件或客户端,那么可以进一步提高并降低内存负载,因为不需要将CSV存储在内存中。

小提琴玩弄原来像你的命名,新的名字后缀2

jsPerf.com比较