Node.js 中的 Json 到 csv

2024-04-14

我正在尝试在 node.js 中将非常大的 json 转换为 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 ('');
  },

平均运行 1 Lac 行时,它从未恢复到事件日志时间。我不得不手动终止该进程。

有人可以建议一个更好的替代方案吗?


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

至于你的问题:

  • 新的数组访问函数,例如forEach()虽然编码时相当舒适,但通常性能不太好。一个简单的for在性能关键的情况下,循环是更好的选择。
  • in escapeCsv()您应用 4 种不同的正则表达式替换,每种替换仅针对一个字符。将它们合二为一。
  • 假设您的数据已经以某种方式结构化,允许进行 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 可以直接流式传输到文件或客户端,则可以进一步改进并减少内存负载,因为 CSV 不必存储在内存中。

摆弄函数 http://jsfiddle.net/j0n9hzs9/原始名称与您的名称相同,新名称带有后缀2.

jsPerf.com 比较 http://jsperf.com/json2csv

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中的 Json 到 csv 的相关文章

随机推荐

  • 如何将单行拆分为多行并插入到 Oracle 中的表中?

    我从表中选择数据Employee Master使用下面的查询 SELECT EMP ID EMP NAME EMP LOC1 EMP LOC2 EMP LOC3 EMP DESG EMP ADDR1 EMP ADDR2 EMP ADDR3
  • android studio 3.4 中的 R.java 文件

    我只是想学习android开发 并且正在使用最新版本的android studio 但是 我找不到R java我的文件夹树视图中的文件 我还清理并重建了我的项目 但我仍然看不到 source R文件夹也不R java file 我也在学习
  • 我的 PHP 应用程序是否正确支持 UTF-8?

    我想确保我所知道的有关 UTF 8 的一切都是正确的 我已经尝试使用 UTF 8 一段时间了 但我不断遇到越来越多的错误和其他奇怪的事情 这使得拥有 100 UTF 8 网站几乎不可能 总有一些地方是我似乎想念的 也许这里有人可以更正我的列
  • 从 A 系列升级到 D 系列 Azure 虚拟机

    我们在 A 系列虚拟机上安装了 SQL Sever 我们想要升级到 D 系列虚拟机 是否只是在 Azure 中升级 VM 并单击 保存 那么简单 或者还有其他我需要注意的事情吗 我听说有人因为虚拟机所在的集群中不可用的级别而遇到升级问题 A
  • 是否有适用于 Nunit 的免费 Visual Studio 插件?

    我很便宜 不想支付 ReSharper 或 TestDriven NET 的费用 是否有适用于 NUnit 的免费 Visual Studio 插件 您可以创建一个空白项目 例如选择控制台应用程序 并在项目的属性中选择 DEBUG 标签并选
  • 如何测试某个地理位置是否在“现实世界”中被访问过?

    好的 所以我已经有了这个问题的答案 但我花了很长时间才找到答案 所以我想我会分享它 特别是因为someone https stackoverflow com users 975457 fusion27问我但在不相关的问题 https sta
  • 在 Maven 测试范围中运行时,如何排除提供的范围中的依赖项?

    在 Maven 测试范围中运行时 如何排除提供的范围中的依赖项 我有一个不寻常的用例 我需要排除特定提供的实现并将其替换为测试用例中的另一个实现 Maven 测试似乎也总是包含其他范围 但就我而言 我想破例 我该怎么做呢 在某些情况下 您需
  • 如何异步等待直到我从数据库收到数据?

    我正在尝试创建可以通过屏幕访问的商店 文件结构 索引 ios js app index js app store database js app store userStore js 索引 ios js import AppRegistry
  • 如何解释无效的 CSS 行?

    我花了大约30分钟调试字体加载 https stackoverflow com q 20900218 1420197页面出现问题 我终于发现我使用了错误的注释 this is a comment font face is this igno
  • 使用 JDBC 获取所有外键

    我正在使用 postgreSQL 我正在尝试从表中获取所有外键 这是我目前正在使用的方法 public String getFKeyData String tableName int i throws SQLException Databa
  • RVM设置ruby默认,当打开新终端时删除RVM设置,返回系统ruby

    我刚买了一台新 MacBook Pro 并尝试在系统中设置 RVM 我安装了RVM并将默认设置为 rvm list default 默认 Ruby 用于新 shell ruby 1 9 3 p194 x86 64 If RVM is在 sh
  • 使用 javascript 对 html 脚本进行小修改,我无法解决[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 这是我的代
  • tkinter python 的全局变量问题

    我正在尝试创建一个简单的界面来访问具有第一个 最后一个 上一个和下一个功能的名称数组 但我用作位置跟踪器的全局变量不起作用 我已经提到过各种问题 非常感谢您的帮助 这是代码 from tkinter import Tk Label Entr
  • Google Maps API v3:地形图的自定义样式

    有谁知道是否可以为地形图创建自定义浮雕样式 显然 您可以为法线贴图创建自定义样式 但我也想更改地形的默认颜色渐变 非常感谢 您确实可以设置地形图的样式 我这里有一个 JSFiddle 演示了这一点 https jsfiddle net w7
  • Eclipse调试时断点错误如何解决?

    需要调试一个JAR文件 ProA 所以在项目中导入源代码 但是在尝试设置断点时 Eclipse 出现一个奇怪的错误 详情如下 Unable to install breakpoint due to missing line number a
  • 为什么 jQuery 1.9+ attr() 方法没有被弃用?

    作为一名 jQuery1 9 软件开发人员 我可以 弃用 使用attr 我日常工作中的方法 正如许多问题所表明的那样 prop 与 attr https stackoverflow com questions 5874652 prop vs
  • jQuery - 在函数之间共享变量

    这应该相当简单 我很确定我只是不明白 仅供参考 该网站使用 jQuery 在内容上运行 ajax load 在我的主父页面上 在标题中我有我的 nav load jQuery 代码
  • 如何从 cpp 文件修改 VS_VERSION_INFO

    当我去资源视图 gt myproject rc gt 版本 gt VS VERSION INFO我有可以更改的字段 可以通过cpp文件更改这些字段吗 所以我可以使用类似的东西 define FileDescription This is m
  • 在猫鼬中指定模式

    我想知道定义此模式的最佳方法是什么 Newsitem 只能有 1 个用户 ID 和 1 个任务 ID 一个任务可以属于多个新闻站点 一个用户可以属于多个新闻站点 我搜索过例子 但我想说的例子并不多 我怎样才能用 mongoose 和 mon
  • Node.js 中的 Json 到 csv

    我正在尝试在 node js 中将非常大的 json 转换为 csv 但它花费了太多时间 并且在转换时导致 100 cpu 占用 jsonToCsv function data var keys Object keys data 0 var