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

Man*_*nny 2 csv arrays d3.js

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

jsh*_*ley 6

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

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

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

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]);
  }
})
Run Code Online (Sandbox Code Playgroud)

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

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

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];
  })
Run Code Online (Sandbox Code Playgroud)

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

[
  [ 'Header1', 'Header2', 'Header3' ],
  [ 329847, 21384, 72912 ],
  [ 232323, 12338, 3218 ],
  ... etc ...
]
Run Code Online (Sandbox Code Playgroud)

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

注意:对于d3v4使用d3.csvParseRows而不是d3.csv.parseRows