按 csv 文件的顺序读取列

Reading columns in their order of the csv file

从 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() returns 一个未定义顺序的数组。

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

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

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

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

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

关系视图:

  • 行没有任何保证顺序
  • 列有明确的顺序,可以通过参考它们的位置来解决

d3.js 视图(csv 文件):

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

如果您想访问 csv 文件中的列顺序,您可以安全地假设 "for...in.." 循环属性或 d3.keys() returns 给定顺序的列。 如果添加或删除列,则可以破坏此顺序。这对于大多数实际应用来说并非如此。

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