Nodejs最大的特点就是基于事件驱动和异步并发操作。大多数人知道nodejs是用于网络后台服务的新平台,可以很方便的提供后台服务;除了用于网络开发外,其实nodejs对于线下文件并发处理也是很方便的,不同于C++、java,利用nodejs可以快速的搭建读写框架,实现文件处理操作。

本文介绍一种程序开发中常见文件格式(csv)的处理。在nodejs官网提供的开发包中,有很多关于csv的包,下载量最多的是CSV包,下面就介绍如何使用CSV包处理文件。

首先下载包:

npm install csv

以官网上的例子解析用法:

//node samples/string.js
var csv =require('csv');
csv() .from('"1","2","3","4"\n"a","b","c","d"') .to(console.log )
//Output: //1,2,3,4
//a,b,c,d

首先要引用csv模块,require('csv'),引用之后,它封装的方法和属性就可以直接使用了。csv()相当于实例化一个对象,.from和.to都是csv封装的方法

.from()方法:顾名思义,是从源文件中读取数据,参数既可以像上面一样直接传字符串,也可以像下面的高级应用传源文件的路径。

.to()方法:是将从form方法中读取出的数据输出,既可以输出到控制台,也可以输出到目标文件。此例子是输出到控制台。

 // node samples/sample.js
var fs =require('fs');
var csv =require('csv');
csv()
.from.stream(fs.createReadStream(__dirname+'/sample.in'))
.to.path(__dirname+'/sample.out')
.transform(function(row){
row.unshift(row.pop());
return row;
})
.on('record',function(row,index){
console.log('#'+index+' '+JSON.stringify(row));
})
.on('close',function(count){
// when writing to a file, use the 'close' event
// the 'end' event may fire before the file has been written
console.log('Number of lines: '+count);
})
.on('error',function(error){
console.log(error.message);
});
// Output:
// #0 ["2000-01-01","20322051544","1979.0","8.8017226E7","ABC","45"]
// #1 ["2050-11-27","28392898392","1974.0","8.8392926E7","DEF","23"]
// Number of lines: 2

.transform()方法:处理from读取出的数据,处理后写入到目标文件;参数可以传回调函数,在回调函数中,可以写处理数据的方法。

.on() : 事件监听机制,

'record'监听读取出的每行记录,参数中row是一行的数据,index是数据个数,注意,此数据个数只是读取出的数据个数,而不是处理完的数据个数,因为nodejs是异步操作,所以处理数据是批量的,程序会一批批的将数据发出给transform,等到处理完一批后再写入目标文件,因而读取出的个数index往往大于已经写入文件的个数,关于如何捕获处理完写入文件的个数,后面会进行处理。

'end' 处理完一个文件后触发的事件;

'error' 处理数据时,发生异常触发的事件;

'close'文件关闭时触发的事件;

高级用法:

csv模块的高级之处在于它按行读取数据,读取出来的数据是以对象的形式,列名是对象的key,值是value,这样取每一列的值就变得非常简单,不想c++中那样还得解析字段。

.from.path(strSrcPath, {header: true, columns: true})

from方法中第二个参数设置将列分开;

在将处理后的数据写入新的文件时,也可以设置参数。

.to.path(strDestPath,{

header: true

,lineBreaks:'windows'

,newColumns: true

,end: false

,columns:fields

,flags : 'w'

})

下面是每个参数的说明

*   `delimiter`   csv文件每列的分隔符;

*   `columns`    目标文件目标文件的列,

*   `header`     是否带有表头;

*    `lineBreaks`  分隔行之间的标识,有 'auto', 'unix', 'mac', 'windows', 'unicode'几种;

*   `flags`       新建目标文件还是在已有的目标文件上追加数据,’w’新建;’a’追加;

*   `end`        在响应end消息之前,文件不可写;

csv断点续传

此csv模块唯一的缺陷就是不能支持断点,即一个文件没有处理完,下次接着处理。解决此问题的关键在于要捕获到程序已经处理数据的个数,前面提到'record'只能监听到程序读取到的个数,而不代表已经写入文件的个数。跟踪了csv模块的源代码,发现只要修改源代码,监听到每次批量写入目标文件时的事件,问题就迎刃而解。

this.emit("writen", this.state.countWriten);

在csv.js添加自定义的监听事件,countWriten就是记录的每次写入目标文件的个数。然后在调用csv模块时添加上此事件即可。

.on('writen', function(index){

console.log("rtn", index);

})

这样就能实时捕获到写入文件的个数,可以将此数据写入游标文件记录下来。稍加修改,csv模块就支持断点的功能,使用起来就完美了。

nodejs:csv模块解析的更多相关文章

  1. Python中csv模块解析

    导入模块 import csv 2.读取csv文件 file1 = open('test1.csv', 'rb') reader = csv.reader(file1) rows = [row for ...

  2. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  3. Nodejs cluster模块深入探究

    由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程.nginx的事件循环等.而对于node而言,由于其也采用事件循环和异步I/O机 ...

  4. TypeScript和Node模块解析策略

    一般我们在模块化编码时,总会导入其它模块,通常我们使用如下语法: import { A } from './a'; // ES6语法 import { A } from 'a'; var A = re ...

  5. NodeJS Web模块

    NodeJS Web模块 本文介绍nodeJS的http模块的基本用法,实现简单服务器和客户端 经典Web架构 Client:客户端一般指浏览器,通过HTTP协议向服务器发送请求(request) S ...

  6. nodejs cheerio模块提取html页面内容

    nodejs cheerio模块提取html页面内容 1. nodejs cheerio模块提取html页面内容 1.1. 找到目标元素 1.2. 美化文本输出 1.3. 提取答案文本 1.4. 最终 ...

  7. Python之CSV模块

    1. CSV简介 CSV(Comma Separated Values)是逗号分隔符文本格式,常用于Excel和数据库的导入和导出,Python标准库的CSV模块提供了读取和写入CSV格式文件的对象. ...

  8. Python与CSV文件(CSV模块)

    Python与CSV文件(CSV模块)   1.CSV文件 CSV(逗号分隔值)格式是电子表格和数据库最常用的导入和导出格式.没有“CSV标准”,因此格式由许多读写的应用程序在操作上定义.缺乏标准意味 ...

  9. python标准库:csv 模块

    原文地址:http://www.bugingcode.com/blog/python_csv.html csv 模块被用来读取CSV格式(用逗号分割数值)的数据文件,CSV格式的文件经常在微软的Exc ...

随机推荐

  1. Chap6: question 46 - 48

    46. 求 1+2+ … +n. 要求:不用乘除法.for.while.if.else.switch.case 以及条件判断语句(A?B:C). a. 利用构造函数求解 #include <io ...

  2. php使用递归计算目录大小

    本文章向大家介绍php如何计算某个目录的大小(多少kb,多少兆m),主要使用filesize函数配合递归函数的方法来实现,需要的朋友可以参考一下本文章的源代码.php使用递归计算目录大小,主要使用fi ...

  3. hibernate的延迟加载及其与session关闭的矛盾

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载. 那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢? 其实很简单,它使用了代理机制.返回给用户的并不 ...

  4. Linux 账户信息显示和实现账户安全

    一.账户信息显示 1.groups命令 使用groups命令可以显示指定用户账户的组群成员身份. [root@redhat2 ~]# groups --help Usage: groups [OPTI ...

  5. 8,SFDC 管理员篇 - 数据模型 - 公式和验证 2

    1, Checkbox 只接受真值或者假值 And(arg1, arg2....)至少两个参数,只有参数都为真时候,才返回真,只要有一个为假,就都为假 例如:AND(DoNotCall, HasOpt ...

  6. Android Service 文档

    应用场景: 1  用于将后台逻辑(Service中)和UI逻辑(Activity中)进行解耦,实现Service功能的复用,为其他程序提供功能. 2  后台功能,由于Activity在进入后台时(On ...

  7. codeforces 361 E - Mike and Geometry Problem

    原题: Description Mike wants to prepare for IMO but he doesn't know geometry, so his teacher gave him ...

  8. 获取Spring容器中的Bean

    摘要 SpringMVC框架开发中可能会在Filter或Servlet中用到spring容器中注册的java bean 对象,获得容器中的java bean对象有如下方法 Spring中的Applic ...

  9. web应用中对配置文件的包装

    <bean id="placeholderConfig" class="com.shz.utils.AdvancedPlaceholderConfigurer&qu ...

  10. afterTextChanged() callback being called without the text being actually changed

    afterTextChanged() callback being called without the text being actually changed up vote8down votefa ...