【问题标题】:How to add header to csv file in more efficient way如何以更有效的方式将标题添加到 csv 文件
【发布时间】:2019-11-23 01:45:20
【问题描述】:

我有一个函数可以在某些响应中将值从数组写入 csv 文件,但在此之前我需要在每个选项卡的第一行中提供带有字段名称的标题,因此我使用 @987654322 编写了标题@等等。

这是我的代码块

function exportToCsv(fName, rows) {
    var csv = 'branch';
    csv += '\t customerId';
    csv += '\t customerName';
    csv += '\t LOAN ID/UT unique ID';
    csv += '\n';
    for (var i = 0; i < rows.length; i++) {
        var row = Object.values(rows[i]);
        for (var j = 0; j < row.length; j++) {
            var val = '';
            val = row[j] === null ? '' : row[j].toString();
            if (j > 0)
                csv += '\t';
            csv += val;
        }
        csv += '\n';
    }
}

在上面的函数中写这五行有什么有效的方法吗?当前代码正在运行,但我正在寻找一种更有效的方法来替换这些行。

还请注意,我刚刚在这里提到了一些标题名称,但实际上我有 20 - 30 个标题字段。

请分享你的想法。

【问题讨论】:

  • 关于工作代码的问题可能更适合codereview.stackexchange.com。在问题中包含rows 的数据结构也会有所帮助。
  • “高效”是什么意思?如果你的意思是让代码更整洁、更容易阅读,你可以创建一个像'createRow'这样的方法,它接受字符串数组。

标签: javascript arrays regex


【解决方案1】:

如果您的row 对象中的键与标头相同,您可以使用.join 将它们串入一个csvheader。否则,您可以使用映射数组将行键转换为 CSV 的适当标题。例如:

const row = {
  branch: 'Main',
  customerId: 45,
  customerName: 'Bill',
  'LOAN ID/UT unique ID': 'X456Y01'
}

let csvheader = Object.keys(row).join('\t');
console.log(csvheader);

const row2 = {
  branch: 'Main',
  Id: 45,
  Name: 'Bill',
  LoanId: 'X456Y01'
};
const map = {
  branch: 'branch',
  Id: 'customerId',
  Name: 'customerName',
  LoanId: 'LOAN ID/UT unique ID'
}

csvheader = Object.keys(row2).map(v => map[v]).join('\t');
console.log(csvheader);

【讨论】:

    【解决方案2】:

    我不确定您所说的高效是什么意思(可以是处理时间,或者更少的代码行数、可读性等)

    作为参考,这里有一个库,通常用作处理/生成 CSV 文件的便捷方法。我认为这也可以导入用于 javascript,而不仅仅是 node.js。

    https://csv.js.org/stringify/api/

    他们有一些可以使用的选项,比如放置一些标题甚至分隔符。

    来自他们网站的示例代码

    const stringify = require('csv-stringify')
    const assert = require('assert')
    
    stringify([
      [ '1', '2', '3', '4' ],
      [ 'a', 'b', 'c', 'd' ]
    ], function(err, output){
      assert.equal(output, '1,2,3,4\na,b,c,d\n')
    });
    

    带有标题选项:(来源:https://csv.js.org/stringify/options/columns/

    stringify( [
      { a: '1', b: '2' }
    ], {
      columns: [ { key: 'a' }, { key: 'b' } ]
    }, function(err, data){
      assert.equal(data, '1,2\n')
    })
    

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 1970-01-01
      • 2015-12-02
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多