LoginSignup
3
1

More than 1 year has passed since last update.

fsでテキストファイルの書き込みをする

Posted at

環境

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となります。

コード

node.js
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);
    }
};

出力結果

テキストファイルの出力結果です。

text.txt
駅名,果物,価格
米原,バナナ,1000
彦根,りんご,3000
3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1