您好我正在尝试使用d3.csv解析csv文件,并且csv文件采用以下格式:
word, stamp, year1data, year2data, year3data, ..., year60data
program, a, 1.2, 2.4, 1.3, ..., 5.0
code, b, 1.4, 5.6, 1.2, ..., 3.4
...
所以每一行都很长,应该解析为数字,这意味着每个数字应该有一个这样的步骤:
d.year1data = +d.year1data
我的问题是:是否有一种处理这类数据的好方法(而不是手动输入year1data ...一直到year60data)?我找到了这个博客:Wide and long data,这似乎是一种解决方法;除了更改原始表格格式外,还有其他方法可以使这个过程更容易吗?
答案 0 :(得分:0)
在D3 v4.x中有一个新功能可以派上用场:当您使用d3.csv
(以及d3.tsv
和d3.dsv
)加载数据文件时,会调用一个数组属性columns
已创建。
根据API:
返回的数组还公开了一个包含输入顺序列名的columns属性(与Object.keys相反,其迭代顺序是任意的)。
让我们看看我们如何使用它。
首先,看看下面的演示(我在这里使用<pre>
元素,因为我无法在Stack片段中使用真正的csv文件)。正如您在控制台中看到的(使用数据数组的第一个对象),所有这些数字实际上都是字符串:
var data = d3.csvParse(d3.select("#csv").text());
console.log(data[0])
&#13;
pre{
display: none;
}
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
<pre id="csv">word,stamp,year1data,year2data,year3data,year4data
foo,a,2,4,6,3
bar,b,8,4,6,2
baz,c,3,7,8,5</pre>
&#13;
但是,我们可以使用data.columns
,在我们的例子中是......
["word", "stamp", "year1data", "year2data", "year3data", "year4data"]
...迭代数据数组中的所有列。
在下面的代码段中,我们使用columns
数组来强制所有不是&#34; word&#34;的列的值。或者&#34;标记&#34;,因为这些列应该有字符串。这是功能:
data.forEach(function(d) {
data.columns.forEach(function(e) {
if (e != "word" && e != "stamp") {
console.log(e)
d[e] = +d[e]
}
})
});
以下是演示:
var data = d3.csvParse(d3.select("#csv").text());
data.forEach(function(d){
data.columns.forEach(function(e){
if(e != "word" && e != "stamp"){
d[e] = +d[e]
}
})
});
console.log(data[0])
&#13;
pre{
display: none;
}
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
<pre id="csv">word,stamp,year1data,year2data,year3data,year4data
foo,a,2,4,6,3
bar,b,8,4,6,2
baz,c,3,7,8,5</pre>
&#13;
总之,您不需要手动指定所有列,特别是在您的情况下,您有60列或更多列。只需使用data.columns
。