【发布时间】:2014-08-20 18:36:12
【问题描述】:
我正在尝试使用 未知标题 名称的 CSV 文件。如何在不知道标题名称的情况下引用每一列?列数和行数也是未知的。您认为最好的方法是什么?
【问题讨论】:
我正在尝试使用 未知标题 名称的 CSV 文件。如何在不知道标题名称的情况下引用每一列?列数和行数也是未知的。您认为最好的方法是什么?
【问题讨论】:
你可以通过在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
【讨论】:
headers,您可以在第一列中找到最大值,如下所示:d3.max(data, function(d) {return d[headers[0]];}) 您需要使用括号表示法而不是点表示法,因为@ 987654337@ 是一个变量,而不是您要检索的密钥。