当前位置:   article > 正文

基本文件操作_csv-stringify

csv-stringify

Node.js使用流(Stream)的方式来处理文件。这种处理方式和处
理网络数据几乎是一样的,操作起来非常方便。使用流的方式操作一
般会有一个问题,即无法在文件的指定位置进行读写。但是Node.js进
行了更底层的操作,除了可以在文件的尾部写入,也可以在文件的特
定位置写入数据。
Node.js中有丰富的API支持对文件的各种操作,包括获取文件信
息、创建和删除文件、打开和关闭文件、读写数据。在本节中将会介
绍文件的一些基本操作,下一节会针对具体格式的文件操作进行讲
解。

  • 打开文件

在处理文件之前都需要调用Node.js中的fs.open方法来打开文
件,然后才能使用文件描述符调用所提供的回调函数。在异步模式下
打开文件的语法如下:
fs.open(path, flags[, mode], callback)
参数使用说明如下:
path:文件的路径。
flags:文件打开的方式,具体说明可参见表5.1。
mode:设置文件模式(权限),文件创建默认权限为可读写。
callback:回调函数,同时带有两个参数。

 

下面的代码将打开一个文件,并在打开之前和打开成功之后在
console中显示相对应的消息。
【代码5-8】

 

  • 关闭文件

关 闭 文 件 将 调 用 fs.close 和 fs.closeSync 方 法 。 其 中 ,
fs.closeSync为同步操作的方法。我们在这里主要介绍调用异步的
fs.close方法。它一共有两个参数可以设定,具体语法如下:

fs.close(fd, callback) 

参数使用说明如下:
fd:通过 fs.o?en()方法返回的文件描述符。
callback:回调函数,没有参数。
在实际开发过程中,如果打开了一个文件,就应该在文件操作完
成之后尽快关闭该文件,为此可能需要跟踪那些已经打开的文件描述
符,并在操作完成之后确保文件正确关闭。下面的代码将建立一个新
的文本文件,并进行打开文件和关闭文件的操作。
【代码5-9】

 

【代码说明】
事实上,并不需要经常调用fs.close来关闭文件。除了几种特例
之外,Node.js在进程退出之后将自动关闭所有文件。原因在于,在使
用fs.readFile、fs.writeFile或fs.append之后,它们并不返回任何
fd,Node.js将在文件操作之后进行判断并自动关闭文件。例如,在执
行下面的代码后并不需要调用fs.close来关闭文件。

 

提示
在调用一些方法的时候,例如fs.createReadStream,在o?tion中
含有autoClose选项。autoClose选项设置为true时,才会在文件操
作之后自动关闭,详细内容请参见相关方法的具体说明或Node.js
的官方手册。 

 

  • 读取文件

Node.js目前支持utf-8、ucs2、ascii、binary、base64、hex编
码的文件,并不支持中文GBK或GB2312之类的编码,所以无法操作GBK
或GB2312格式文件的中文内容。如果想读取GBK或GB2312格式的文件,
需要第三方的模块支持,建议使用iconv模块或iconv-lite模块。其
中,iconv模块仅支持Linux,不支持Windows。
在Node.js中读取文件一般调用fs.read方法。该方法从一个特定
的文件描述符(fd)中读取数据,语法格式如下:
fs.read(fd, buffer, offset, length, position, callback)
参数使用说明如下:
fd:通过fs.o?en()方法返回的文件描述符。
buffer:数据写入的缓冲区。
offset:缓冲区写入的写入偏移量。
length:要从文件中读取的字节数。
?osition:文件读取的起始位置,如果?osition的值为null,就
会从当前文件指针的位置读取。
callback:回调函数,有err、bytesRead、buffer三个参数。其
中err为错误信息,bytesRead表示读取的字节数,buffer为缓冲
区对象。
下面的代码是一个文件读取的示例。首先,调用fs.open()方法将
文件打开;然后,从第100个字节开始,读取后面的1024个字节的数
据;读取完成后,fs.open()会使用回调方法返回数据,再处理读取到
的缓冲数据。
【代码5-10】 

读取文件也可以调用fs.readFile()方法,语法格式如下:

fs.readFile(filename[, options], callback) 

filename:要读取的文件。
options:一个包含可选值的对象。
■ encoding {String | Null}:默认为null。
■ flag {String}:默认为'r'。
callback:回调函数。
fs.readFile方法是在fs.read上的进一步封装,两者的主要区别
是fs.readFile方法只能读取文件的全部内容。 

提示
js文件必须保?为UTF8编码格式。使用Node.js开发时,无论是代
码文件还是要读写的其他文件都建议使用UTF8编码格式保?,这样
可以无须额外的模块支持。 

 

  • 写入文件

写入文件一般调用fs.writeFile和fs.appendFile方法。两者都可
以将字符串或者缓存区中的内容直接写入文件,如果检测到文件不存
在将创建新的文件。fs.writeFile和fs.appendFile的语法格式也非常
接近,分别如下:
(1)fs.writeFile语法:
fs.writeFile(filename, data[, options], callback)
参数使用说明如下:
path:文件路径。
data : 写 入 文 件 的 数 据 , 可 以 是 string ( 字 符 串 ) 或
buffer(流)对象。
options:该参数是一个对象,包含{encoding, mode, flag},默
认编码为utf-8,模式为0666,flag为 'w'。
callback:回调函数,只包含错误信息参数(err)。
(2)fs.appendFile语法:
fs.appendFile(file, data[, options], callback)
参数说明如下:
file:文件名或者文件描述符。
data:可以是string(字符串)或buffer(流)对象。
options:该参数是一个对象,包含{encoding, mode, flag},默
认编码为utf-8,模式为0666,flag为'w'。
callback:回调函数,只包含错误信息参数(err)。
下面将字符串(string)和流(buffer)作为数据源写入一个文
件中:
【代码5-11】

【代码说明】
在执行写入文件之后,不要使用提供的缓存区,因为一旦将其传
递给写入函数,缓存区就处于写入操作的控制之下,直到函数结束之
后才可以重新使用。

提示
在写入文件时一般要包含写入信息的具体位置,如果以追加模式打
开文件,那么文件的游标位于文件的尾部,因此写入的数据也处于
文件的尾部。 

其他文件操作
在实际的编程过程中,我们需要操作多种不同格式的文件。
Node.js除了提供官方的API对文件操作进行支持,也可以通过NPM安装
第三方的模块来进行文件操作。本节主要介绍如何通过Node.js和第三
方模块来操作CSV文件、XML文件和JSoN文件。本节我们以CSV文件为例
来详细介绍。
CSV是一种常见的数据格式。Node.js中有很多模块可以解析CSV文
件,这里建议使用node-CSV来进行文件的解析操作。node-CSV遵循开
源 的 BSD 协 议 , 项 目 在 git 网 站 的 网 址 为
https://github.com/wdavidw/node-CSV。它一共包含4个包,分别为
CSV-generate、CSV-parse、stream-transform和CSV-stringify。各
个包的功能具体如下:
CSV-generate:用来生成标准的CSV文件。
CSV-parse:将CSV文件解析为数组变量。
stream-transform:一个转换框架。
CSV-stringify:将记录转换为CSV的文本。
使用node-CSV时,需要先通过npm命令来安装CSV的包,具体命令
如下: 

npm install csv
其中每个包都与stream2和stream3的标准相兼容,并且提供一个
简单的回调函数。CSV-parse解析方法可以使用多种选项,但所有的选
项都是可选的,而不是必需的,参见表5.2。

下面的代码将使用CSV模块中的stream来读取、解析和转换CSV文
件。
【代码5-12】

 

【代码说明】
首先要调用require('csv')引用csv模块,引用之后,就可以直接
调用它封装的方法和属性了。csv()相当于实例化一个对象,.from()
和.to()都是csv封装的方法。
.from()方法:从源文件中读取数据,参数既可以像上面一样直接
传字符串,也可以像下面的高级应用传源文件的路径。
.to()方法:将从form()方法中读取出来的数据输出,既可以输出
到控制台,也可以输出到目标文件。此例子是输出到控制台。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/529201
推荐阅读
相关标签
  

闽ICP备14008679号