在JavaScript中对CSV数据进行数据操作(fill, min, max)



我正在将不同的指示器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

对于每个指示文件,我需要:

  • 空白填写每个实体(id)缺失的年份
  • 查找每个实体的时间跨度
  • 查找每个实体的最小值和最大值
  • 查找指标
  • 的时间跨度
  • 查找指标的最小值和最大值

执行这些操作的廉价方法是什么?或者,是否有一个好的JavaScript库来执行这些常见的数据操作,并有效地将数据存储在各种对象表示中?

我希望上面文件的最终表示看起来像这样:
data = {
    population : {
        entities : 
            AF : {
                data : {
                    1800 : 3280000,
                    1801 : 3280000,
                 },
                entity_meta : {
                    start : 1800,
                    end : 
                    min : 
                    max :
             },
            [...]
        indicator_meta : {
                start : 1700,
                end : 
                min : 
                max :
        }
        [...]

谢谢!

假设CSV数据为2d数组:

var data = [[AF,1800,3280000],
[AF,1820,3280000],
[AF,1870,4207000],
[AG,1800,37000],
[AG,1851,37000],
[AG,1861,37000]]

对于这个例子,我将使用jquery的实用程序函数,因为它将使工作更容易,没有任何实际的开销。

// 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];
        }
    }
});

这显然不是所有的代码,但它应该清楚地解释了应该采取的方法。

也不是说你想要的final对象结构非常复杂,你应该在适当的地方使用数组,特别是对于entitiesdata

使用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} };
}

也许,YUI将有助于一些批量操作。http://yuilibrary.com/yui/docs/dataschema/dataschema-text.html

有javascript sql数据库库。我想到了TaffyDB

最新更新