2

我有一个 .csv 文件,如下所示:

The Start Date, The User Id, The User Name,
date, id, name,
12-12-12, 12345, John Doe
01-02-13, 67891, Jane Doe

第一行是对第二行键的描述。我正在加载 .csv 文件,如下所示:

d3.csv("data.csv", function(error, data) {
  data.forEach(function(d) {
    d.date = parseDate(d.date);
    d.id   = formateID(d.id);
    d.name = formatename(d.name);
    d.close = +d.close;
  });

我想将第一行(描述)与我的数据模型分开,因为我仍然计划在以后使用它,但是我不允许修改 .csv 文件的格式。有没有办法我只能捕获这些信息:

date, id, name,
12-12-12, 12345, John Doe
01-02-13, 67891, Jane Doe

从csv?

4

2 回答 2

11

d3.csv()函数同时进行加载解析,而不给您干预的机会。由于您需要干预,因此您需要将 csv 作为纯文本加载——而不对其进行解析——然后删除第一行,然后将其作为字符串传递给 csv 模块进行解析。

对于加载,使用d3.xhr() 对于解析,使用d3.csv.parse().

你应该得到这样的结果:

d3.xhr('data.csv').get(function (err, response) {
  var dirtyCSV = response.responseText;
  var cleanCSV = dirtyCSV.split('\n').slice(1).join('\n');
  var parsedCSV = d3.csv.parse(cleanCSV);
})

编辑

这是一种比上述转换成本更低的转换(尚未经过测试/调试):

d3.xhr('data.csv').get(function (err, response) {
  var dirtyCSV = response.responseText;
  var firstEOL = dirtyCSV.indexOf('\n');
  var parsedCSV = d3.csv.parse(cleanCSV.substring(firstEOL+1));
})
于 2013-06-13T16:00:06.110 回答
0

对于那些想要忽略 csv 中的某些行的人,可以使用以下代码段。

//Read the data
d3.csv("abc.csv?"+Math.random(),
  function(d){
    //if current row's value column is blank, then ignore it. Otherwise do further process.
    if(d.value!=''){ 
      return { date : d3.timeParse("%Y-%m-%d %H:%M:%S")(d.date), value : d.value }
    }
  },
于 2019-10-14T09:54:05.767 回答