2015年11月5日木曜日

learnyounodeを解いてみる(3問目)

learnyounode [MY FIRST I/O!]

同期処理 をするファイルシステムの関数を使ってファイルの改行文字(\n)の数を出力するアプリを書いてください。 cat file | wc -l と同じようなアプリです。 アプリの1つ目のコマンドライン引数は、そのファイルへのパスです。テスト用のファイルを作る必要はありません。


3問目はファイルを読み込んでそのファイル内に書かれている文字列の行を表示するというアプリです。ファイル読み込みは各プログラミング言語でも必須の機能なのですが、Nodeの親と言えるJavaScriptにはその特殊な立場やセキュリティの問題からファイルを扱う機能がありませんでした。
ですからビルトインオブジェクトにもFileオブジェクトはありません。
ただしAjaxなどでサーバからファイルを取得する限定的な扱いは存在しましたし、HTML5から制限のある中でローカルファイルを扱えるFileクラスも定義されました。
JavaScriptがそのようなことなのでNodeでどうファイルを扱うか困ってしまいそうですが、幸いNodeでファイルを読み込むにはfsというモジュールを使用することで扱えます。fsはFile Systemの略だそうです。

File System

問題で気をつけることは同期処理が指定されていることです。Nodeでは非同期が売りなので同期処理の方が使用頻度は少ないでしょうが、振る舞いとしては同期処理のほうが簡単なので問題として出されたのでしょう。
ファイルを同期処理で読み込むにはreadFileSyncプロパティを使用します。

fs.readFileSync

それを踏まえてファイルを読み込んで見ましょう。

readFile.js

var fs = require('fs');

var filename = "読み込むファイル"
var data = fs.readFileSync(filename, 'utf8');
console.log(data);


これでファイルの内容が読み込めました。
後は改行('\n')を数えるだけです。ヒントには得られたバッファを文字列に変えてから改行文字をsplitメソッドで区切れば改行ごとに分割された文の配列になるのでその要素数を数えれば改行を数えたことと同じになると解説してくれています。ただし最期の改行で句切られた空要素も入るのでそれは-1することに注意します。

コマンドライン引数からファイルを読み込んでと書いてあるので前回のprocess.argv[2]でファイル名を引き取るようにします。

以上を合わせて

filelines.js

var fs = require('fs');
var filename = process.argv[2];

var data = fs.readFileSync(filename, 'utf8');
var lines = data.toString().split('\n').length - 1;
console.log(lines);


$ learnyounode verify filelines.js 

以上で合格です。

0 件のコメント:

コメントを投稿