注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.7

我将骄傲的活在这个大唐盛世

 
 
 

日志

 
 

nodejs中最简单的csv操作库node-csv以及最咫尺天涯的那异步  

2013-04-23 20:52:08|  分类: 挨踢咋活 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

人生在世,总免不了要操作csv文件。nodejs中操作csv的最好的库是node-csv

说它最好,是因为它基本满足了你对csv的所有要求。不需要你关心csv读写的任何细节,你只用处理一行记录。你对行记录增加字段内容,就是加列;你删除一些字段,就是减列;你忽略一些内容,就是过滤行。你心目中80%的常用功能它都提供了,你还有何更进一步的要求呢?

当然还可以提出一些苛刻的东西来要求,不过我们的目的只是管用起来方便简单,它确实满足了我们的需求。其实,对任何其它种语言来说,我觉得都应该提供这种层面的封装:整体上它全部搞定,你只用关心最核心的那一步。其它的语言有这种类库吗?

在用过了很多很多次这样的线下文件操作后,终于发现面临了一个新的问题。异步时候如何操作csv呢?

异步操作csv

举个例子来说,获取一行记录后,需要去调用http服务获取相应的值。而http的调用,在默认的nodejs中应该是异步处理的。该如何解决这个问题呢?

1.同步的http请求方式

同步惯了,就全部换成同步方式吧。只能用c++弄个同步的http请求插件。

2.异步的csv方式

还是用异步吧。node-csv是支持异步的。这个诀窍需要仔细的看说明。这个诀窍还需要仔细的摸索

Transform callback run synchronously同步模式:

csv()
.from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge')
.to(console.log)
.transform(function(data, index){
return data.reverse()
});
// Executing `node samples/transform.js`, print:
// 94,Gainsbourg,Serge\n82,Preisner,Zbigniew

Transform callback run asynchronously异步模式:

csv()
.from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge')
.to(console.log)
.transform(function(data, index, callback){
process.nextTick(function(){
callback(null, data.reverse());
});
});
// Executing `node samples/transform.js`, print:
// 94,Gainsbourg,Serge\n82,Preisner,Zbigniew

是的,node-csv内部是通过transform的回调函数的参数个数来约定同步和异步模式的。

如果是同步,要求回调函数必须返回行data。

function transform(data,index)
{
var opt = options;
opt.path = T_Path.format(data.pcsid);
opt.data = data;
data.index = index;
return data;
});

如果是异步,必须自己调用回调函数的第三个函数,进行记录的保存

var options =
{
host: 'www.dianping.com',
port: 80,
path: '',
method: 'GET'
};

//-抓取一个页面-
function spiderUrl(opt, fnSpiderData)
{
var req = http.request(opt, function(res)
{
res.setEncoding('utf8');

var g_data="";
res.on('data', function (chunk)
{
g_data+=chunk;
});

res.on('end', function()
{
fnSpiderData(g_data, opt);
});
});

req.on('error', function(e)
{
console.log('problem with request ' + opt.path + ' : ' + e.message);
});

req.end();
}

function fnMySpiderData(data, opt)
{
//-添加新字段:newfld-
opt.data.newfld=data;
//-保存记录-
opt.fn(null, opt.data);
}

function transform(data, index, fn)
{
var opt = merge(null,options);
opt.path = T_Path.format(data.pcsid);
opt.data = data;
opt.fn=fn;

//-添加新字段:index-
data.index = index;

spiderUrl(opt, fnMySpiderData);
}

另外说明一点:异步的时候,总是不会保存列字段。可以看见行的顺序是打乱的。此外,可能会异步做很多操作,不知道是否承受得起!

  评论这张
 
阅读(2691)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018