从CSV文件中选择一些列

时间:2014-07-01 00:24:54

标签: javascript csv d3.js

我有一个CSV文件,其中包含100行(作为案例)和1100列(作为功能) (每个案例有1100个功能)。

我想使用20列(比如55-74)并将其可视化而不是1100列。如何选择这些数据(100 x 20)并在我的代码中使用它?

1 个答案:

答案 0 :(得分:1)

从理论上讲,这可以做到......

您可以使用访问器功能创建仅包含指定范围的20列的输出数据:

d3.csv('path/to/your/file.csv')
  // this is run once for each row of your data
  .row(function accessor(d) {
    // make an array of all the keys (1100 of them)
    var keys = d3.map(d).keys();
    // create an empty object
    var outputDatum = {};
    // fill it with the key/value pairs from indexes 55 - 74
    for (var i = 55; i < 75; i++) {
      outputDatum[keys[i]] = d[keys[i]];
    }
    // return the object you built
    return outputDatum;
  })
  // this is the callback that runs when the data is ready
  .get(function callback(error, data) {
    // use the data to make something
  });

问题是,如果不知道这些密钥的名称是什么,它们可能对您没什么用处。此外,在这些神秘的20列中存储了什么样的值?它们都是同一类型吗?

您在技术上仍然可以使用这些值,例如:

function callback(error, data) {
  d3.selectAll('div')
    .data(data)
    .enter().append('div')
    .text(function(d) { return d3.values(d)[6]; }
}

这将创建包含每行第7列中的值的div ...除了不完全相同,因为对象键/值对不是以定义的顺序存储或检索的。

您可能需要重新考虑数据的结构。如果列的索引比它们的名称更相关,那么它们应该是你的行。


<强>更新

如果您知道您感兴趣的列的标签,那么这会使问题变得更加简单。然后,您可以使用访问器功能输出所选数据,如下所示:

d3.csv('path/to/your/file.csv')
  .row(function(d) {
    return {
      x: d.featureX,
      y: d.featureY,
      z: d.featureZ
    };
  })
  .get(function(e, data) {
    d3.selectAll('div')
      .data(data)
      .enter().append('div')
      .text(function(d) { return d.x; });
  });

这一次,访问者函数为您提供了返回数据,其中包含属性xyz,表示调用的原始数据(对于此示例)featureXfeatureYfeatureZ。然后,此示例将为每行的featureX创建一个div。