我正在将不同的指标CSV文件加载到JavaScript中,例如:
CSV for population:
id,year,value
AF,1800,3280000
AF,1820,3280000
AF,1870,4207000
AG,1800,37000
AG,1851,37000
AG,1861,37000
对于每个指标文件,我需要:
执行这些操作的廉价方法是什么?或者,是否有一个很好的JavaScript库来执行这些常见的数据操作并将数据有效地存储在各种对象表示中?
我希望上面文件的最终表示看起来像:
data = {
population : {
entities :
AF : {
data : {
1800 : 3280000,
1801 : 3280000,
},
entity_meta : {
start : 1800,
end :
min :
max :
},
[...]
indicator_meta : {
start : 1700,
end :
min :
max :
}
[...]
谢谢!
答案 0 :(得分:2)
让我们假设你有一个二维数组中的CSV数据:
var data = [[AF,1800,3280000],
[AF,1820,3280000],
[AF,1870,4207000],
[AG,1800,37000],
[AG,1851,37000],
[AG,1861,37000]]
对于这个例子,我将使用jQuerys实用程序函数,因为它可以使工作变得更容易而没有任何实际开销。
// we will loop thru all the rows
// if the id does not belong to the entities then we will add the property.
// if the property does exist then we update the values
var entities = {}
$.each(data, function (i, n) {
// set property
if (!entities[n[0]]) {
entities[n[0]] = {
data : {
n[1]: n[2]
},
entity_meta: {
start: n[1],
end: n[1]
min: n[1]
max: n[1]
}
}
// update property
} else {
// add new data property
entities[n[0]]['data'][n[1]] = n[2];
// if the property should change then update it
if ( entities[n[0]]['entity_meta']['min'] > n[1] ) {
entities[n[0]]['entity_meta']['min'] = n[1];
}
}
});
这显然不是所有的代码,但它应该清楚地解释应该采取的方法。
也不是说你想要的最终对象结构非常过于复杂你应该在适当的时候使用数组,特别是entities
和{{1} }。
答案 1 :(得分:1)
使用jQuery AJAX获取CSV文件。
$.get("test_csv.csv", function(result){
csvParseAndCalc(result);
});
使用简单的JavaScript解析CSV并执行计算
// assumes your sample data is how all data will look
// proper csv parsing (by the spec) is not used is favor is speed
function csvParseAndCalc(result) {
var entities = {};
var indicator_meta = {"start":null, "end":null, "min":null, "max":null};
var rows = result.split('\n'); //your data doesnt need proper (to spec) csv parsing
// run calculations ignore header row
for(var i=1; i<rows.length; i++) {
var r = rows[i].split(',');
var id = r[0];
var yr = parseInt(r[1]);
var val = parseInt(r[2]);
var entity = entities[id];
var edata;
var emeta;
// create entity if it doesn't exist
if(entity == null) {
entities[id] = { "data": {}, "entity_meta": {"start":null, "end":null, "min":null, "max":null} };
entity = entities[id];
}
// entity data
edata = entity.data;
edata[yr] = val;
// entity meta
emeta = entity.entity_meta
if(emeta.start == null || emeta.start > yr) emeta.start = yr;
if(emeta.end == null || emeta.end < yr) emeta.end = yr;
if(emeta.min == null || emeta.min > val) emeta.min = val;
if(emeta.max == null || emeta.max < val) emeta.max = val;
// calc indicator_meta
if(indicator_meta.start==null || indicator_meta.start > yr)
indicator_meta.start = yr;
if(indicator_meta.end==null || indicator_meta.end < yr)
indicator_meta.end = yr;
if(indicator_meta.min==null || indicator_meta.min > val)
indicator_meta.min = val;
if(indicator_meta.max==null || indicator_meta.max < val)
indicator_meta.max = val;
}
// fill gaps on entity data
for(var id in entities) {
var entity = entities[id];
var emeta = entity.entity_meta;
var edata = entity.data;
for(var i=emeta.start + 1; i<emeta.end; i++) {
if(edata[i] == null) edata[i] = edata[i-1];
}
}
return {"population": {"entities":entities, "indicator_meta":indicator_meta} };
}
答案 2 :(得分:1)
也许,YUI会对一些批量操作有所帮助。 http://yuilibrary.com/yui/docs/dataschema/dataschema-text.html
答案 3 :(得分:1)
有javascript sql数据库库。想到了TaffyDB。