【问题标题】:Javascript CSV headers text formattingJavascript CSV 标头文本格式
【发布时间】:2020-07-25 17:28:48
【问题描述】:

在各种解决方案的帮助下,我有了一个 javascript CSV 函数,可以将 JSON 数据转换为 CSV 格式。

代码是这样的:

function convertToCSV(headers, objArray) {
  var header_line = "";
  for (const [key, value] of Object.entries(headers)) {
    header_line += [key, value] + "\n";
  }

  var array = typeof objArray !== "object" ? JSON.parse(objArray) : objArray;
  var str = "";

  for (var i = 0; i < array.length; i++) {
    var line = "";
    for (var index in array[i]) {
      if (line !== "") line += ",";

      line += array[i][index];
    }

    str += line + "\r\n";
  }

  var csv = header_line + "\n" + str;

  return csv;
}

function exportCSVFile(headers, columns, items, fileTitle) {
  if (columns) {
    items.unshift(columns);
  }
  var jsonObject = JSON.stringify(items);

  var csv = convertToCSV(headers, jsonObject);

  var exportedFilenmae = fileTitle + ".csv" || "export.csv";

  var blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
  if (navigator.msSaveBlob) {
    navigator.msSaveBlob(blob, exportedFilenmae);
  } else {
    var link = document.createElement("a");
    if (link.download !== undefined) {
      var url = URL.createObjectURL(blob);
      link.setAttribute("href", url);
      link.setAttribute("download", exportedFilenmae);
      link.style.visibility = "hidden";
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    }
  }
}

export default function generateCSV(dataarray, filename) {

  var columns = {
      "Count": "Count",
      Coeff: "Coeff",
  };

  var headers = {
     "# Some random long sheet title": "",
     "# User Id": "37467yteyuw8473872938100j",
     "# Created on": new Date() + "\t\t",
  };

  let json_data= [
    {
      "Count": "55",
      Coeff: "56",
    },
    {
      "Count": "55",
      Coeff: "56",
    },
    {
      "Count": "55",
      Coeff: "56",
    },
  ];

  var formatItems = [];

  json_data.forEach((item) => {
    formatItems.push({
      "Count": item["Count"],
       Coeff: item["Coeff"]
    });
  });

  var fileTitle = "my_data";

  exportCSVFile(headers, columns, itemsFormatted, fileTitle);
}

功能完全正常。卡住的问题案例是:

  1. 标题文本# Created On 在文件被下载然后打开时被隐藏。下载文件时,需要手动拖动此列,使其完全可见。

  1. 如果标题键中包含逗号 (,),例如:

    var headers = {

        "# Some random long, sheet title": "",
        "# User Id": "37467yteyuw8473872938100j",
        "# Created on": new Date() + "\t\t",
      };
    

即使在一个字符串之后,它也会将标题分成 2 个列。

对此的任何帮助表示赞赏。在此先感谢:)

【问题讨论】:

  • 尝试引用它。
  • @DaveNewton 我试过了。但是没有用。你能帮我修改代码吗?
  • 只需在所有标题中添加引号。
  • @DaveNewton 引号已经在那里了
  • 我没有看到任何在字符串中添加引号的代码。我可能会错过它(在移动设备上);你能指出哪一行在输出中添加引号?

标签: javascript arrays json csv


【解决方案1】:

虽然你用双引号声明了 header_line 变量(字符串),但它实际上只是一个字符串。要让 csv 忽略昏迷,它必须有双引号(在较大的字符串中)。

如果您使用 console.log() 生成的 csv,您应该会看到它当前类似于.... ...., # User Id:, 37467yteyuw8473872938100j,

您可以尝试在该行中添加转义引号 header_line += [key, value] + "\n"; 所以它变成了header_line += '\"' + [key, value] +'\"' + "\n";

这可能不完全正确,但您应该能够从控制台和原始 csv 文件中看到(在文本编辑器中打开 csv 文件)。在 csv 文件中它应该是这样的(我认为)

"# User Id:, 37467yteyuw8473872938100j",

免责声明:我无法让您的代码运行以正确测试它。

编辑:当前的 csv 输出

# Some random long sheet title,
# User Id,37467yteyuw8473872938100j   <--- the Comma is Separating the Values (CSV)
# Created on,Wed Jul 29 2020 00:16:41 GMT-0400 (Eastern Daylight Time)      

Count,Coeff
55,56
55,56
55,56

【讨论】:

  • 我认为您的 csv 变量在项目周围没有引号,它只是一个字符串 ` # Some random long sheet title, # User Id,37467yteyuw8473872938100j # Created on, Wed Jul 29 2020 00: 16:41 GMT-0400(东部夏令时间)计数,Coeff 55,56 55,56 55,56`
  • 感谢您的详尽解释 :) 我会对其进行测试,如果有任何问题,请告诉您?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2016-06-21
  • 1970-01-01
  • 2013-12-19
相关资源
最近更新 更多