【问题标题】:Download an array as a CSV, but the data inside the array has commas in it将数组下载为 CSV,但数组内的数据中有逗号
【发布时间】:2022-01-24 08:51:41
【问题描述】:

我有一个数组,看起来像这样:

rows = [
        [Name, Description, Number ...],
        ["A thing", "Description, but it has commas in it", 6, ...],
        ...
       ]

我正在尝试将其下载为 csv 文件。这是我到目前为止的代码:

// Make a csv from rows
let csv = rows.map(row => row.join(",")).join("\n");

document.getElementById("csv_download").setAttribute("download", "file_name.csv");

document.getElementById("csv_download").href = "data:text/csv;charset=utf-8," + encodeURIComponent(csv);

当数组中没有逗号时,这可以正常工作,但现在它会在“描述”之后看到逗号并将其拆分。我也不能用 " 来分割它,因为有些项目是数字。

我该如何解决这个问题?

【问题讨论】:

  • 向我们展示一个生成的 CSV 示例 - 在 CSV 中的 quoted 文本中包含逗号(甚至换行符)是完全可以接受的。也许您的解析器不明白这一点?虽然看起来您生成 CSV 的尝试有点天真

标签: javascript csv


【解决方案1】:

我该如何解决这个问题?

它因人而异。 CSV 不是完全标准化的格式。但它会涉及以某种方式转义数据中的逗号。

最常用的方法是用双引号将逗号括起来。如果数据中有双引号,你可以用另一个双引号“转义”它们。

将其应用于您的代码:

let csv = rows.map(
    row => row.map(
        col => typeof col !== "string" ? col : `"${col.replace(/"/g, '""')}"`
    ).join(",")
).join("\n");

const rows = [
    ["Name", "Description", "Number"],
    ["A thing", "Description, but it has \"commas\" in it", 6],
];
let csv = rows.map(
    row => row.map(
        col => typeof col !== "string" ? col : `"${col.replace(/"/g, '""')}"`
    ).join(",")
).join("\n");
console.log(csv);

但同样,这只是处理它的一种方法。

【讨论】:

  • (糟糕,我错误地将数字用引号括起来。如果在内部箭头函数的开头处没有看到typeof col !== "string",请点击刷新.)
猜你喜欢
  • 2015-07-24
  • 1970-01-01
  • 2011-06-26
  • 2019-04-28
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多