【问题标题】:Reading columns in their order of the csv file按 csv 文件的顺序读取列
【发布时间】:2015-01-25 12:31:13
【问题描述】:

从csv文件加载数据时,是否可以获取列的顺序?

例如加载 csv 文件的典型方法是调用 d3.csv 函数:

d3.csv("data.csv", function(error, data) {
var ageNames = d3.keys(data[0]).filter(function(key) { return key !== "State"; });

通常,列存储为对象的属性,因此无法再检索顺序。此外,d3.keys() 返回一个未定义顺序的数组。

我问这个是因为我想按 csv 文件中的顺序对列进行排序。任何帮助将不胜感激。

【问题讨论】:

  • 只使用索引来访问数据,例如data[0][0] 将是第一行第一列中的数据。
  • 非常感谢!您可以将您的评论作为答案,我很乐意接受。

标签: javascript csv d3.js


【解决方案1】:

你不需要使用列名来访问数据,你可以使用键的索引。索引由文件中的顺序决定,因此正是您要查找的内容。

要获取对象的键,请使用Object.keys()

var keys = Object.keys(data[0]);
data[0][keys[0]]; // datum in the first row, first column

【讨论】:

  • 呵呵.. 我刚试过你的答案,但它不起作用:(。我使用了以下脚本:bl.ocks.org/mbostock/3887051。数据是一个对象数组。所以数据[0][0]是未定义的。你能澄清一下吗?
  • 抱歉,我误解了您要执行的操作。查看我的编辑。
  • Lars:感谢您的快速回复,但 API 仍然显示:数组的顺序未定义 github.com/mbostock/d3/wiki/Arrays。我假设函数 d3.keys() 执行典型的“for ..in..”循环,不保证任何顺序。很抱歉坚持,但这个话题已经困扰了我很长一段时间,我发布了几个相关的问题。我哪里错了?
  • 这应该在实践中为您提供正确的顺序,除非您正在动态修改数据(即删除或添加键)。它不适合你吗?
  • 我已经在几个例子中看到了关于正确顺序的假设。不,我没有遇到过这种情况不正确的情况。但是,阅读关于没有保证顺序的那句话会让您怀疑这种方法是否正确。让我在答案中表达我的理解。如果你同意,那么我不会再打扰你了:)
【解决方案2】:

从关系视图来看,d3.js 读取文件的方式具有相反的属性似乎令人惊讶:

关系视图:

  • 行没有任何保证顺序
  • 列具有明确定义的顺序,可以通过引用它们的位置来解决

d3.js 视图(一个 csv 文件):

  • 行具有明确定义的顺序,可以通过参考它们的行号来寻址。 (它们存储在一个数组中)
  • 列最终成为对象中的一组属性,因此它们没有明确定义的顺序

如果您想像在 csv 文件中一样访问列的顺序,您可以放心地假设 "for...in.." 循环遍历属性或 d3。 keys() 按给定顺序返回列。 如果添加或删除列,则可以破坏此订单。对于大多数实际应用而言,情况并非如此。

另见https://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/。描述的一个例外是:当列名是唯一的数字时,Chrome 浏览器会根据它们的数字顺序而不是它们的列顺序对它们进行排序。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2018-12-12
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    相关资源
    最近更新 更多