1. 找到一个能够直接加载CSV文件的jQuery插件吗? 2. 将CSV文件转换为JSON并使用它代替? 3. 还是采取完全不同的方法?
我没有找到一个能够处理外部CSV文件的jQuery插件,但也许我漏掉了什么。
如果你运用一些巧妙的方法,就可以在不使用服务器的情况下完成。
你需要两个东西:
jquery-csv解析库专门用于解析符合RFC 4180标准的CSV,具有许多超出将CSV数据转换为JavaScript数据的功能。为了演示的目的,我们将使用两个特性:
第一个是toArrays()方法。它将多行CSV字符串转换为2D数组。
第二个是用户定义的解析器钩子,自动将输出(即所有字符串)转换为标量(即整数/浮点数)数据。基本上,通过使用函数回调,可以将额外的处理内联到解析器中。
一旦将CSV数据分配给字符串变量,将其转换为JavaScript数据非常简单。
var csv = "" // this is the string containing the CSV data
var data = $.csv.toArray(csv, {
onParseValue: $.csv.hooks.castToScalar
});
var flotData = [];
var flotData.push(data);
var data = [];
flot = $.flot($('#plotdiv'), data, options);
// handles csv files
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// reset the flot dataset
flot.setData([]);
for(var i=0, len=files.length; i<len; i++) {
flotFileData(files[i], i);
}
}
function flotFileData(file, i) {
var reader = new FileReader();
reader.readAsText(file);
reader.onload = function(event){
var csv = event.target.result;
var newData = $.csv.toArrays(csv, {
onParseValue:$.csv.hooks.castToScalar
});
var data = flot.getData();
data[i] = newData;
flot.setData(data);
flot.setupGrid();
flot.draw();
};
reader.onerror = function(){ alert('Unable to read ' + file.fileName); };
}
这将以纯文本形式读取文件,并通过event.target.result使内容可用。 CSV解析器将CSV转换为二维数组形式的标量数据。 要堆叠多个数据集,我们需要附加到已经在图表中的数据,因此我们需要先通过flot.getData()存储现有数据。添加新数据,通过flot.setData()设置它,最后重新绘制图表。
注意:如果不需要重新计算图形的范围,则可以跳过flot.setupGrid()调用。
理想情况下,每次文件加载阶段都应该只发生一次重绘,但是这个演示还没有被优化。也就是说,图形将为每个读取的文件重新绘制(绝对不理想)。
如果您想看到它的实际效果,请查看jquery-csv项目提供的“Flot Demonstration”。我建议您尝试同时加载analytics1.csv和analytics2.csv数据集,以便您可以看到两者如何在图表上叠加。
如果您决定走服务器端路线加载CSV文件,则还有一个更基本的示例,演示了如何从文本区域加载CSV。
声明:我是jquery-csv的作者。
更新:
由于Google Code已关闭,jquery-csv已迁移到GitHub。
$.get()
在服务器上加载文件。$.csv
期望一个字符串,但从$.get()
返回的数据是一个对象。我猜我可以尝试这个:https://dev59.com/DG035IYBdhLWcg3wHsSR 但感觉有点混乱... - Richard