导入CSV数据时解析带日期的标题行

时间:2019-11-14 16:00:38

标签: javascript csv datetime d3.js

我正在使用d3导入CSV文件以进行数据可视化。我的CSV文件中包含我需要转换为日期的标题行,以及需要转换为整数的数据:

ISBN,2019-08,2019-09,2019-10
9782749205465,107,488,218
9789423069313,95,87,186

我可以导入CSV文件并使用以下命令将数据解析为整数:

d3.csv("/assets/2019-20-download-stats.csv").then(function (data) {
  data.forEach(function(d) {
    d.ISBN = +d.ISBN;
    d['201908'] = +d['201908'];
    d['201909'] = +d['201909'];
    d['201910'] = +d['201910'];
  });
});

但是标题行是输出数组中的所有字符串,例如:

{
  "201908": 107,
  "201909": 488,
  "201910": 218,
  "ISBN": 9782749205465,
}

导入数据时如何格式化标题行?

1 个答案:

答案 0 :(得分:1)

几乎可以肯定是XY problem。我看不到任何情况,您的数据应具有以日期为键的对象。最重要的是,请注意以下事实:如果将日期对象作为对象的键传递,则JavaScript会自动将日期对象转换为字符串。如果您(无论出于何种原因)确实希望将日期作为键,则应使用Map

所有这些,这就是您应该做的:在行转换功能(代码中没有任何内容)中,检查日期...

if (!isNaN(new Date(key).getTime()))

...,如果找到一个,请使用new Date生成密钥:

foo[new Date(key)] = +d[key]

这是一个使用d3.csvParse的演示(与您的d3.csv完全一样):

const csv = `ISBN,2019-08,2019-09,2019-10
9782749205465,107,488,218
9789423069313,95,87,186`;

const data = d3.csvParse(csv, row);

function row(d) {
  const newObject = {};
  for (var key in d) {
    if (!isNaN(new Date(key).getTime())) {
      newObject[new Date(key)] = +d[key]
    } else {
      newObject[key] = +d[key]
    }
  };
  return newObject;
};

console.log(data)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>