如何动态选择CSV文件中的行进行转换?

时间:2017-06-22 04:44:34

标签: javascript csv d3.js

您好我正在尝试使用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,这似乎是一种解决方法;除了更改原始表格格式外,还有其他方法可以使这个过程更容易吗?

1 个答案:

答案 0 :(得分:0)

'列'属性

在D3 v4.x中有一个新功能可以派上用场:当您使用d3.csv(以及d3.tsvd3.dsv)加载数据文件时,会调用一个数组属性columns已创建。

根据API

  

返回的数组还公开了一个包含输入顺序列名的columns属性(与Object.keys相反,其迭代顺序是任意的)。

让我们看看我们如何使用它。

首先,看看下面的演示(我在这里使用<pre>元素,因为我无法在Stack片段中使用真正的csv文件)。正如您在控制台中看到的(使用数据数组的第一个对象),所有这些数字实际上都是字符串:

&#13;
&#13;
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;
&#13;
&#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]
        }
    })
});

以下是演示:

&#13;
&#13;
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;
&#13;
&#13;

总之,您不需要手动指定所有列,特别是在您的情况下,您有60列或更多列。只需使用data.columns