使用未知的D3j:标题/列数/行数

时间:2014-08-20 18:36:12

标签: arrays csv d3.js

我正在尝试使用CSV文件,但使用未知标题名称。如何在不知道标题名称的情况下引用每列?列数和行数也是未知的。你认为最好的方法是什么?

1 个答案:

答案 0 :(得分:6)

您可以通过从d3.keys()返回的数据的第一行调用d3.csv来获取标题名称数组:

d3.csv('path/to/your/file.csv', function(error, data) {
  var headers = d3.keys(data[0]);
})

然后,根据您要执行的操作,您可以迭代此数组并依次使用每个标题名称。例如:

d3.csv('path/to/your/file.csv', function(error, data) {
  var headers = d3.keys(data[0]);
  for (var i = 0; i < headers.length; i++) {
    doSomething(headers[i]);
  }
})

就行数而言,只需获取返回数据的length属性即可找到它。

d3.csv('path/to/your/file.csv', function(error, data) {
  var numRows = data.length;
})

Jeff K询问是否有办法保证从标头解析的密钥顺序与原始文件中定义的顺序相同。这是可能的,但您需要使用较低级别的d3方法进行文本解析。

您可以使用d3.text获取文件的原始文本,然后使用d3.csv.parseRows分别解析行。这是一个例子:

d3.text('path/to/your/file.csv')
  .get(function(error, rows) {
    var parsedRows = d3.csv.parseRows(rows);
    var headers = parsedRows[0];
  })

d3.csv.parseRows函数创建一个二维数组;一个行数组,每行是其值的数组:

[
  [ 'Header1', 'Header2', 'Header3' ],
  [ 329847, 21384, 72912 ],
  [ 232323, 12338, 3218 ],
  ... etc ...
]

通过获取parsedRows数组中的第一个元素,您可以按照它们的定义顺序返回所有标头值的数组。

注意:对于d3v4,请使用d3.csvParseRows代替d3.csv.parseRows