環境
Ubuntu20.4
node.js v16.14.0
はじめに
fsモジュールを使って、テキストファイル(CSVファイル)に書き込みする処理のサンプルコードです。fsモジュールはNode.jsに標準で組み込まれています。よって、npm install fsや、yarn add fsは行う必要はありません。
解説
fsを使えるようにするため、最初にfsをrequireで読み込みます。
var fs = require('fs');
下記処理で、空のテキストファイルを作成しています。第1引数に書き込み先のファイル名、第2引数に書き込む値を設定しています。書き込む値を空白にすることで、0kbの空ファイルが作成されます。この関数の便利なところは、書き込むファイルが存在していない場合は、新規でファイルを作成し、存在している場合は、ファイルを一旦削除してから、新規ファイルを作成してくれるところです。writeFileSync1行で、ファイルのオープン、書き込み、クローズの3役を一旦に行ってくれます。
書き込みを行う関数には、writeFileSyncと、writeFileの2種類存在します。Syncがつくかつかないかの違いです。Syncがつくと同期型で処理を行い、Syncがつかないと非同期型で処理を行います。どっちで処理をしたいかは好きづきでいいかと思います。ただし、データ件数が大量にある場合は、レスポンスを考えると非同期型にした方がいいです。
fs.writeFileSync( file , "" );
上記の書き方で、ファイルのオープン、書き込み、クローズを1行で実現できるが、3つの処理を分けて記述する方法もあります。下記の処理は、ファイルのオープンだけを行います。第2引数のwは新規書き込みモードでオープンするという意味です。既存のファイルの末行に追加更新する場合は、第2引数にa(append)を指定します。今回は空ファイルに書き込みをするため、aモードでオープンしても結果的には同じです。
fs.writeFileSync( file , 'ヘッダ情報' );と記述して、先頭行に「ヘッダ情報」を書き込み、2行目から明細行を書き込む場合は、必ず、aモードでオープンしないといけません。
var fd = fs.openSync( file, "w");
下記の処理は、ary配列を文字列に変換して書き込みを行っています。また、配列のカンマ区切りを改行コードに変換しています。第3引数の0は、書き込むときの開始位置です。大抵、0で問題ないはずです。
fs.writeSync(fd, ary.join("\n"), 0);
下記の処理で、オープンしたファイルのクローズを行います。オープンとクローズは1対1で対応させる必要があります。しかし、ファイルをクローズせず、オープンにしせたままでプログラムを終了させ、再度、同じファイルをオープンした場合、「既に、オープンされています」といったエラーがでるようなことはありません。恐らく、オープンする時に、オープン済であれば、自動でクローズさせるように仕組んでいるのだと推測されます。この辺は堅牢な作りになっているのでしょう。つまり、下記1行をコメントにしてコードを実行しても正常に動作します。
fs.closeSync(fd);
オープン、書き込み、クローズと3処理を個別に記述する書き方にも、同期型の書き方、非同期型の書き方と2種類あります。同期型は、それぞれ、openSync、writeSync、closeSync、非同期型は、open、write、closeとなります。
コード
function test_write() {
try {
var fs = require('fs');
var ary = [];
var file = __dirname + "/test" + ".txt";
ary.push("駅名,果物,価格");
ary.push("米原,バナナ,1000");
ary.push("彦根,りんご,3000");
fs.writeFileSync( file , "" );
var fd = fs.openSync( file, "w");
fs.writeSync(fd, ary.join("\n"), 0);
fs.closeSync(fd);
} catch ( err ){
console.log(err.name + ': ' + err.message);
process.exit(-1);
}
};
出力結果
テキストファイルの出力結果です。
駅名,果物,価格
米原,バナナ,1000
彦根,りんご,3000