解决需求的实际过程记录——10万条降雨数据的处理

栏目: JavaScript · 发布时间: 5年前

内容简介:需求:师弟让我帮他处理一个数据,是一个降雨数据,从2015.1.号到2016.12.31号收集的某地区的降雨数据,一共105000条数据,数据格式为csv格式,第一列为编号,第二列为时间,第三列为该时刻的降雨量,数据特征是如果某段时间的前后都有36个0,则说明这段时间内为一场降雨,我们要做的是求一场降雨的起始时刻以及降雨总量。初次看到数据的时候感觉思路挺清晰的,后来写的时候发现处处是坑,好多细节需要注意到。所以我的理解是上面的result与下面的result等价

需求:师弟让我帮他处理一个数据,是一个降雨数据,从2015.1.号到2016.12.31号收集的某地区的降雨数据,一共105000条数据,数据格式为csv格式,第一列为编号,第二列为时间,第三列为该时刻的降雨量,数据特征是如果某段时间的前后都有36个0,则说明这段时间内为一场降雨,我们要做的是求一场降雨的起始时刻以及降雨总量。

解决需求的实际过程记录——10万条降雨数据的处理

初次看到数据的时候感觉思路挺清晰的,后来写的时候发现处处是坑,好多细节需要注意到。 先列出采坑记录:

  • 我用数组的时候取值和赋值直接通过下标来实现,后来发现这样还是不行滴,不说经常会出现问题,从写代码的优雅感角度来说这是一种粗暴的方式,所以还是需要一种优雅的方式——— 定义构造函数

    function Dictionary(){
        this.data = new Array();
        this.put = function(key,value){
            this.data[key] = value;
        };
        this.get = function(key){
            return this.data[key];
        };
        this.size = function(){
            return this.data.length;
        };
    }
    复制代码
  • 对于下面的数据应该怎么取值,开始我是 result[0][0].start 来获取start的值,但是发现这种方式是错误的,正确的方式应该是 result[0].start ,即这样理解:result是一个一维数组,而不是二维数组,数组的每个元素是一个json元素

var result=[ [ start: '201501131150',
    end: '201501140950',
    sum: 15.599999999999984 ],
  [ start: '201501250430',
    end: '201501250910',
    sum: 1.4000000000000004 ],
  [ start: '201501262230',
    end: '201501270330',
    sum: 1.2000000000000002 ],
  [ start: '201501271320',
    end: '201501272050',
    sum: 1.0999999999999999 ],
  [ start: '201501281030',
    end: '201501290050',
    sum: 2.800000000000001 ]
 ]
复制代码

所以我的理解是上面的result与下面的result等价

var result=[ { start: '201501131150',
    end: '201501140950',
    sum: 15.599999999999984 },
  { start: '201501250430',
    end: '201501250910',
    sum: 1.4000000000000004 },
  { start: '201501262230',
    end: '201501270330',
    sum: 1.2000000000000002 },
  {start: '201501271320',
    end: '201501272050',
    sum: 1.0999999999999999 },
  { start: '201501281030',
    end: '201501290050',
    sum: 2.800000000000001 }
 ]
复制代码
  • 文件的读写操作,想把最后的结果类似上面的result格式写入到TXT文件中,刚开始用fs.writeFile方法,发现怎么写都不行,即时把result转换成字符串再写入都不行,要么获取到空的数组,要么获取到的全是逗号。后来想到:用循环来做吧,每次将数组里的一个json对象输出到TXT文件,注意这里用Buffer转换每次的数成二进制的再写入到文件中

    var chunks=[];
            var length=0;
            result.forEach((item,index)=>{
                var start=item.start;
                var end=item.end;
                var sum=item.sum;
                var value=start+" "+end+" "+sum+" "+'\r\n';
                var buffer=new Buffer(value);
                chunks.push(buffer);
                length+=buffer.length;
                })
            var resultBuffer = new Buffer(length);
            for(var i=0,size=chunks.length,pos=0;i<size;i++){
                chunks[i].copy(resultBuffer,pos);
                pos+=chunks[i].length;
            }
            fs.writeFile('./result.txt',resultBuffer,function(err){
                if(err) throw err;
                console.log('write JSON into TEXT');
            });
    复制代码
  • 有一个问题要考虑的是如果一场降雨前面0的个数大于36的话,那么这只能算作一场降雨,如果不加其他约束条件的话前面有38个0的时候会算成3场雨的,所以我们需要当前面已经连续36个零的时候第第37个数不能为零(原谅我直接这么暴力的写,因为36个真的不算太多)

    if (data[i][1] == 0 && data[i + 1][1] == 0 && data[i + 2][1] == 0 && data[i + 3][1] == 0 && data[i + 4][1] == 0 && data[i + 5][1] == 0&&
                data[i+6][1] == 0 && data[i + 7][1] == 0 && data[i + 8][1] == 0 && data[i + 9][1] == 0 && data[i + 10][1] == 0 && data[i +11][1] == 0&&
                data[i+12][1] == 0 && data[i + 13][1] == 0 && data[i + 14][1] == 0 && data[i + 15][1] == 0 && data[i + 16][1] == 0 && data[i + 17][1] == 0&&
                data[i+18][1] == 0 && data[i + 19][1] == 0 && data[i + 20][1] == 0 && data[i + 21][1] == 0 && data[i + 22][1] == 0 && data[i + 23][1] == 0&&
                data[i+24][1] == 0 && data[i + 25][1] == 0 && data[i + 26][1] == 0 && data[i + 27][1] == 0 && data[i + 28][1] == 0 && data[i + 29][1] == 0&&
                data[i+30][1] == 0 && data[i + 31][1] == 0 && data[i + 32][1] == 0 && data[i + 33][1] == 0 && data[i + 34][1] == 0 && data[i + 35][1] == 0&&
                data[i+36][1]!=0)
    复制代码
  • 还有一个问题是如果到了数据的最后一个数时就不用判断后面还要36个0了,只需要判断前面有36个零就ok了,所以这里也要考虑到这个情况

    if ((data[j][1] == 0 && data[j + 1][1] == 0 && data[j + 2][1] == 0 && data[j + 3][1] == 0 && data[j + 4][1] == 0 && data[j + 5][1] == 0&&
                            data[j+6][1] == 0 && data[j + 7][1] == 0 && data[j+ 8][1] == 0 && data[j + 9][1] == 0 && data[j + 10][1] == 0 && data[j +11][1] == 0&&
                            data[j+12][1] == 0 && data[j + 13][1] == 0 && data[j+ 14][1] == 0 && data[j + 15][1] == 0 && data[j + 16][1] == 0 && data[j + 17][1] == 0&&
                            data[j+18][1] == 0 && data[j + 19][1] == 0 && data[j + 20][1] == 0 && data[j+ 21][1] == 0 && data[j + 22][1] == 0 && data[j + 23][1] == 0&&
                            data[j+24][1] == 0 && data[j + 25][1] == 0 && data[j + 26][1] == 0 && data[j + 27][1] == 0 && data[j + 28][1] == 0 && data[j + 29][1] == 0&&
                            data[j+30][1] == 0 && data[j + 31][1] == 0 && data[j + 32][1] == 0 && data[j + 33][1] == 0 && data[j + 34][1] == 0 && data[j + 35][1] == 0)
                            ||j==data.length-1 )
    复制代码
  • 最后要注意的是写入到TXT文件中时字符串后面加上“\r\n"才能换行,这样我们直接点开TXT文件看到的才是经过换行的数据,如果是在字符串后面加上”\n"那么我们用编辑器打开TXT文件确实看到的也是换行后的数据,但是这时直接打开TXT文件看到的数据并没有换行,所以这点也要注意

    var value=start+" "+end+" "+sum+" "+'\r\n';
    复制代码

    最后我们来看看得到的结果txt文件,大功告成!

解决需求的实际过程记录——10万条降雨数据的处理

源码:

var fs = require("fs");

fs.readFile('./test.csv', function (err, data) {
    var table = new Array();
    if (err) {
        console.log(err.stack);
        return;
    }
    ConvertToTable(data, function (table) {
        var cont=[];
        var result=[]
        transform(table,cont);
        console.log("**************************************************")
        cont.forEach((item,index)=>{
            result[index]=item.data;
        })
        console.log(result)
        var chunks=[];
        var length=0;
        result.forEach((item,index)=>{
            var start=item.start;
            var end=item.end;
            var sum=item.sum;
            var value=start+" "+end+" "+sum+" "+'\r\n';
            var buffer=new Buffer(value);
            chunks.push(buffer);
            length+=buffer.length;
            })
        var resultBuffer = new Buffer(length);
        for(var i=0,size=chunks.length,pos=0;i<size;i++){
            chunks[i].copy(resultBuffer,pos);
            pos+=chunks[i].length;
        }
        fs.writeFile('./result.txt',resultBuffer,function(err){
            if(err) throw err;
            console.log('write JSON into TEXT');
        });

    console.log("程序执行完毕");
})
})


function ConvertToTable(data, callBack) {
    data = data.toString();
    var table = new Array();
    var rows = new Array();
    rows = data.split("\r\n");
    for (var i = 0; i < rows.length; i++) {
        table.push(rows[i].split(","));
    }

    callBack(table);
}

function transform(data,cont) {
    var k = 0;

    for (var i = 0; i < data.length; i++) {
        var list = new Dictionary();
        if (data[i][1] == 0 && data[i + 1][1] == 0 && data[i + 2][1] == 0 && data[i + 3][1] == 0 && data[i + 4][1] == 0 && data[i + 5][1] == 0&&
            data[i+6][1] == 0 && data[i + 7][1] == 0 && data[i + 8][1] == 0 && data[i + 9][1] == 0 && data[i + 10][1] == 0 && data[i +11][1] == 0&&
            data[i+12][1] == 0 && data[i + 13][1] == 0 && data[i + 14][1] == 0 && data[i + 15][1] == 0 && data[i + 16][1] == 0 && data[i + 17][1] == 0&&
            data[i+18][1] == 0 && data[i + 19][1] == 0 && data[i + 20][1] == 0 && data[i + 21][1] == 0 && data[i + 22][1] == 0 && data[i + 23][1] == 0&&
            data[i+24][1] == 0 && data[i + 25][1] == 0 && data[i + 26][1] == 0 && data[i + 27][1] == 0 && data[i + 28][1] == 0 && data[i + 29][1] == 0&&
            data[i+30][1] == 0 && data[i + 31][1] == 0 && data[i + 32][1] == 0 && data[i + 33][1] == 0 && data[i + 34][1] == 0 && data[i + 35][1] == 0&&
            data[i+36][1]!=0) {
            if((i+37)<=data.length) {
                for (var j = (i + 37); j <data.length; j++) {
                    if ((data[j][1] == 0 && data[j + 1][1] == 0 && data[j + 2][1] == 0 && data[j + 3][1] == 0 && data[j + 4][1] == 0 && data[j + 5][1] == 0&&
                        data[j+6][1] == 0 && data[j + 7][1] == 0 && data[j+ 8][1] == 0 && data[j + 9][1] == 0 && data[j + 10][1] == 0 && data[j +11][1] == 0&&
                        data[j+12][1] == 0 && data[j + 13][1] == 0 && data[j+ 14][1] == 0 && data[j + 15][1] == 0 && data[j + 16][1] == 0 && data[j + 17][1] == 0&&
                        data[j+18][1] == 0 && data[j + 19][1] == 0 && data[j + 20][1] == 0 && data[j+ 21][1] == 0 && data[j + 22][1] == 0 && data[j + 23][1] == 0&&
                        data[j+24][1] == 0 && data[j + 25][1] == 0 && data[j + 26][1] == 0 && data[j + 27][1] == 0 && data[j + 28][1] == 0 && data[j + 29][1] == 0&&
                        data[j+30][1] == 0 && data[j + 31][1] == 0 && data[j + 32][1] == 0 && data[j + 33][1] == 0 && data[j + 34][1] == 0 && data[j + 35][1] == 0)
                        ||j==data.length-1 ){
                        list.put("start", data[i + 36][0]);
                        list.put("end", data[j - 1][0]);
                        var temp = 0;
                        for (var n = i + 36; n <= j - 1; n++) {
                            temp = temp + Number(data[n][1]);
                        }
                        list.put("sum", temp);
                        break;
                    }
                }
                cont[k++] = list;
            }

        }
    }

}

function Dictionary(){
    this.data = new Array();
    this.put = function(key,value){
        this.data[key] = value;
    };
    this.get = function(key){
        return this.data[key];
    };
    this.size = function(){
        return this.data.length;
    };
}


复制代码

以上所述就是小编给大家介绍的《解决需求的实际过程记录——10万条降雨数据的处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机科学概论(第7版) (平装)

计算机科学概论(第7版) (平装)

J.Glenn Brookshear / 王保江 / 人民邮电出版社 / 2003-9 / 49.0

《计算机科学概论(第2版)》更新了部分内容,使其更加贴近于计算机科学领域内的最新趋势,这包括了网络安全、开源运动、关联存储、公钥加密、XML、Java和C#等内容。扩充了网络和Internet所覆盖的内容。一个程序用C#语言编写,还有C、C++和Java,作为语言的例子。不过整个方法依旧保持语言的独立。一起来看看 《计算机科学概论(第7版) (平装)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具