Node.js完全初心者が、ファイルを同期で読み取り、行数をコンソールに出力する方法


Node.js完全初心者が、ファイルを同期で読み取り、行数をコンソールに出力する方法

こんにちは。ディレクターのエリカです。

こちらは、Node.jsという言葉を聞いて「何となくはわかるけど、実際にどんなものか触ったことがない」という初心者の方に向け、チュートリアル用モジュール「learnyounode」でエクササイズをしていくコーナーの第3回目です。

前回は、合計値を計算する方法について紹介しましたが、今回はファイルを同期で読み取り、行数をコンソールに出力していきます。

Node.jsを勉強したいと思っている人のキッカケや第一歩になれば幸いです。それでは早速はじめていきましょう。

MY FIRST I/O!(Exercise 3 of 13)

「learnyounode」のインストールがまだの方は、こちらからどうぞ。

問題

あるファイルを同期で読み取り、そのファイルの行数をコンソールに出力してください。

ちょうど、下記のコマンドと同じような感じになります。

$ cat file | wc -l

なお、実行時にファイルのフルパスを第一引数で与えるものとします。

ヒント

node.jsでファイルアクセスをする場合には、コアライブラリに含まれる「fs」モジュールを利用する必要があります。

コアライブラリに含まれるモジュールや、グローバルなモジュールを利用するには、下記のように記述します。

var fs = require('fs')

これで、「fs」という変数名で「fs」モジュールへアクセスできるようになりました。すべての同期、もしくはブロッキングでのファイル操作は「Sync」で終わるメソッドでおこなうことができます。

ファイルを読み込むには「fs.readFileSync(‘/path/to/file’)」を使います。このメソッドからは、ファイルのすべてを含んだ「Buffer」オブジェクトを得ることができます。

「Buffer」オブジェクトは、ASCIIや、バイナリなどの任意のデータ配列を効率的に扱えるようにします。

たとえば、下記のように「toString()」メソッドで簡単に文字列に変換することができます。

var str = buf.toString()

文字列に変換した場合「.split()」というメソッドを使うことができます。これは、任意の文字列をある文字列で分割した配列を作成します。

つまり、行数を数えたいのであれば、改行コードで分割してしまえば、簡単に行数を調べることができます。

また、今回も以下のように実行することにより、自動的にテストファイルが割り当てられます。

learnyounode run program.js

解答

learnyounode verify program.js

自動的にテストファイルが割り当てられチェックが行われます。

解答例は以下のようになります。


var fs = require('fs') // fsモジュールを準備

var contents = fs.readFileSync(process.argv[2]) // Exercise 2 で行った引数へのアクセス
var lines = contents
    .toString() // Bufferを文字列に変換
    .split('\n') // 改行コードで分割
    .length - 1 // 行数(最終行を除外)
console.log(lines) // コンソールへの出力

// readFileSync を実行する際に、文字コード「utf8」を指定すると、直接文字列を取得できるので、
// .toString()を使わずに行えます。
// fs.readFileSync(process.argv[2], 'utf8').split('\n').length - 1

まとめ

いかがでしたでしょうか?

ファイルへのアクセスができると、いろいろな応用が効きそうですよね。

クリアにならなかった場合は、プログラムを修正し、再度答え合わせのコマンドを実行してください。何度でも繰り返して、クリアになるまで頑張ってみましょう。

次回は、「非同期でのファイルアクセス」に挑戦します。ますます、JavaScriptらしくなっていきますよ。それでは、また!

 

【「learnyounode」エクササイズシリーズ】

  1. Node.js完全初心者向けチュートリアル用モジュール「learnyounode」を使ってみよう
  2. Node.js完全初心者のための、合計値を計算し、コンソールに出力する方法
  3. Node.js完全初心者が、ファイルを同期で読み取り、行数をコンソールに出力する方法
  4. Node.js完全初心者が、ファイルを非同期で読み取り、行数をコンソールに出力する方法
  5. Node.js完全初心者が、ディレクトリを非同期で読み取り、ファイルをコンソールに出力する方法

この記事を書いた人

エリカ
エリカ ディレクター 2012年入社
ディレクターのエリカです。趣味は美術鑑賞で、絵画や展示などたくさんの作品を眺めるのが好きです。得意料理は「鍋」です。よろしくお願いします。