11
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

[node.js] テキストファイルを読みこみ

テキストファイルを読むためには readFileSync 関数を使用します。12

概要

  1. fs (filesystem) モジュールを使用します。
  2. readFileSync 関数でファイル(テキストストリーム)を読み込みます。
  3. テキストストリームを split 関数で改行ごとに行を分割します。
  4. 各行について処理を実行します。

read_file.js ファイルを読み出し、コンソールに表示する node スクリプト
sample.txt read_file.js により読み込まれるファイル
この2つのファイルは同じディレクトリに置く想定です。

read_file.js
const fs = require('fs');

var text = fs.readFileSync("./test1.txt", 'utf8');
var lines = text.toString().split('¥n');
for (var line of lines) {
  console.log(line)
}
test1.txt
/*
read_file.js により読み込まれるファイルです。
文字コードは UTF-8 、改行コードは CRLF で作成しています。
改行コードを CRLF としているのは筆者の開発環境が Windows のためです。
*/
1行目
2行目
3行目
[実行結果] node read_file.js
行目
行目
行目

説明

1. fs (filesystem) モジュールを使用します。

const fs = require('fs');

「ファイルを読み込む」とは「ファイルシステムを操作する」ということです。
「ファイルシステムを操作」するためには filesystem モジュールを使用する必要があります。
filesystem モジュールを使うためには require 関数で呼び出します。
ここでは、require で filesystem モジュール(fs)を呼び出した後に、ファイルシステムの操作(ここではファイルの読み込み)をするために、fs という定数で定義をしています。今後、fs を使うことによって、filesystem モジュールの関数を使うことができるようになります。

2. readFileSync 関数でファイル(テキストストリーム)を読み込みます。

var text = readFileSync('./sample.txt",'utf8');

ファイルを読み込むために、readFileSync 関数を使用します。

[String] readFileSync(filepath, encode);
引 数:ファイル名(ファイルパスを含む)、ファイルの文字コードを指定
戻り値:String 型

readFileSync 関数の引数にはファイルパス、および、ファイルの文字コードを指定します。

ファイルパスは相対パス、絶対パスどちらでも指定可能です。この例では read_file.js と同じディレクトリに sample.txt がありますので、'./sample.txt' と指定しています。

ファイルの文字コードの指定は、指定していない場合はデフォルトで utf8 と解釈されます。

readFileSync 関数で読み込まれたファイルはテキストストリームとして String 型で戻されます。ここでは text 変数にテキストストリームを格納しています。

テキストストリームとは改行文字を含めたテキストの全データです。テキスト処理は行単位で行いますが、テキストストリームだと行には分かれておらず、改行文字も含めた1つのデータとなっています。そのため、テキストストリームのままでは処理がしにくいです。
次で、改行コードにもとづいて、テキストストリームを分割して、行単位にします。

3. テキストストリームを split 関数で改行ごとに行を分割します。

var lines = text.toString().split('¥n');

ここでは改行コード(\n)でテキストストリームを分割して(split 関数)、lines 変数に格納しています。split 関数は 文字列操作関数で、String 型のデータに対して、引数で指定した文字にもとづいて、分割し、配列として返すという関数です。lines 変数は改行を除く各行を値として収める配列変数になります。

4. 各行について処理を実行します。

for (var line of lines) {console.log(line)}

これは配列変数の操作でよく見る例文ですよね。
ここでは、配列変数 lines に格納されている各要素の値(ここではファイルの各行の文字データ)を、変数 line に格納して、配列の要素の最後まで(ファイルの最後の行まで)、繰り返し、コンソールに表示させています。
実際のテキスト処理はこの
console.log(line);
に書き、text 変数に対して処理をします。


  1. ファイルを読むための関数として、readFileSync 関数のほかに、readFile 関数があります。これはファイルを「非同期」的に読むための関数です。「同期」と「非同期」との違いは処理の完了を待つかどうかにあります。「同期」の場合は処理(ここではファイルの読み込み)が完了してから次の処理を実行しますが、「非同期」の場合は処理が完了しなくても次の処理を始めます。場合によっては処理をする前に次の処理を始める場合もあります。ファイルを読み込む場合、ほとんどがそのファイルの全行の読み込みを待ってから次の処理をはじめたいというケースが多いので、ここでは同期処理を行う readFileSync 関数のみを紹介しています。 

  2. 「同期」と「非同期」のどちらを使うかのメリット・デメリットは処理の内容次第です。ファイルの読み込みでは、「同期」の場合はファイルを読み込むまで処理はプログラムは状態となります。それに対して「非同期」の場合はとりあえず処理は先に進めてくれます。メリット・デメリットを説明する記事はいずれ書きたいと思います。 

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
11
Help us understand the problem. What are the problem?