解决需求的实际过程记录——10万条降雨数据的处理
栏目: JavaScript · 发布时间: 5年前
内容简介:需求:师弟让我帮他处理一个数据,是一个降雨数据,从2015.1.号到2016.12.31号收集的某地区的降雨数据,一共105000条数据,数据格式为csv格式,第一列为编号,第二列为时间,第三列为该时刻的降雨量,数据特征是如果某段时间的前后都有36个0,则说明这段时间内为一场降雨,我们要做的是求一场降雨的起始时刻以及降雨总量。初次看到数据的时候感觉思路挺清晰的,后来写的时候发现处处是坑,好多细节需要注意到。所以我的理解是上面的result与下面的result等价
需求:师弟让我帮他处理一个数据,是一个降雨数据,从2015.1.号到2016.12.31号收集的某地区的降雨数据,一共105000条数据,数据格式为csv格式,第一列为编号,第二列为时间,第三列为该时刻的降雨量,数据特征是如果某段时间的前后都有36个0,则说明这段时间内为一场降雨,我们要做的是求一场降雨的起始时刻以及降雨总量。
初次看到数据的时候感觉思路挺清晰的,后来写的时候发现处处是坑,好多细节需要注意到。 先列出采坑记录:
-
我用数组的时候取值和赋值直接通过下标来实现,后来发现这样还是不行滴,不说经常会出现问题,从写代码的优雅感角度来说这是一种粗暴的方式,所以还是需要一种优雅的方式——— 定义构造函数
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文件,大功告成!
源码:
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万条降雨数据的处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 1100万条电商客户数据信息泄漏
- GANs 千万条,安全第一条
- 每天5万条告警,腾讯如何做到“咖啡运维”?
- Kafka如何做到1秒处理1500万条消息?
- 智能合约安全千万条 访问权限设置第一条
- A 站惨遭黑客攻击,近千万条用户数据泄露
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Trading and Exchanges
Larry Harris / Oxford University Press, USA / 2002-10-24 / USD 95.00
This book is about trading, the people who trade securities and contracts, the marketplaces where they trade, and the rules that govern it. Readers will learn about investors, brokers, dealers, arbit......一起来看看 《Trading and Exchanges》 这本书的介绍吧!