【问题标题】:D3js working with unknown: headers/number of columns/number of rowsD3js 使用未知:标题/列数/行数
【发布时间】:2014-08-20 18:36:12
【问题描述】:

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

【问题讨论】:

    标签: arrays csv d3.js


    【解决方案1】:

    你可以通过在d3.csv返回的数据的第一行调用d3.keys()来得到一个header名称的数组:

    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

    【讨论】:

    • 好的,我会尝试一下,看看效果如何。谢谢
    • 我试过那个方法。得到了数组中的标题,但我如何使用它来访问不同的列。到目前为止,我一直在使用 d.columnName 但 d.headers[0] 似乎没有工作。例如,我有 4 列,我想知道第一列中的最大值。我将如何使用 d3.max() 函数?
    • 如果您按照我上面的方式定义变量headers,您可以在第一列中找到最大值,如下所示:d3.max(data, function(d) {return d[headers[0]];}) 您需要使用括号表示法而不是点表示法,因为@ 987654337@ 是一个变量,而不是您要检索的密钥。
    • 非常感谢您的帮助!
    • @jshanley 我不认为 d3.keys 可以保证键的顺序。有没有办法准确知道 CSV 标头中的第一个、第二个、第三个等键是哪个键?
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多