evs-dsv
该模块为文本分隔符分隔进行解析,常见的数据格式为逗号分隔的csv文件或制表符分割的tsv文件,这些表格非常受excel欢迎,而且比json更节省空间,代码实现基于论文RFC 4180Common Format and MIME Type for Comma-Separated Values (CSV) Files. 感兴趣的可以访问github阅读源码及解析esv-dsv
API参考与算法解析:
evs.dsvFormat(delimiter):
为指定的dsv构造一个新的dsv解析器和格式化程序,分割符必须为单个字符,如ASCII码
dsv.parse(string[, row])
解析指定的字符串,该字符串要采用带有相应分隔符值的格式,返回解析后的对象数组。
该方法不同于dsv.parseRows,该方法要求DSV内容的第一行包含以分隔符分隔的列名列表,例如:
Year,Make,Model,Length
1997,Ford,E350,2.34
2000,Mercury,Cougar,2.38
解析后的js数组为:
[
{"Year": "1997", "Make": "Ford", "Model": "E350", "Length": "2.34"},
{"Year": "2000", "Make": "Mercury", "Model": "Cougar", "Length": "2.38"}
]
另外对于row转换函数,如果未指定则字段值都为字符串类型,为了安全起见不会转换为数字、日期或其他类型。(在某些情况下,Javascript可能会自动将字符串强制转换为数字,例如使用+运算符的时候,这是原生Js的内容了)。但是最后是指定这样一个转换函数,此外,本模块中还写了以一个接口实现自动的转化函数,推断和胁迫强制类型的转换。
如果你指定了一个行转换函数,则会为每一行调用指定的函数,得到一个表示当前行的d对象以及下标i从0开始的项,如果遇到空或undefined程序会自动忽略。一个传入行转换函数的用法是这样的(结合上面的数组去理解):
var data = d3.csvParse(string, function(d) {
return {
year: new Date(+d.Year, 0, 1), // lowercase and convert "Year" to Date
make: d.Make, // lowercase
model: d.Model, // lowercase
length: +d.Length // lowercase and convert "Length" to number
};
});
d3中也提到一点:使用+而不是parseInt或ParseFloat通常更快,但是具有限制性,如使用+强制执行“30px”时的返回结果是NaN,另外两个函数返回30。
dsv.parseRows(string[, row])
解析指定的字符串,该字符串必须使用