Node.jsを使用してテキストファイルを読み取りますか?


124

ターミナルでテキストファイルを渡し、そこからデータを読み取る必要があります。これを行うにはどうすればよいですか?

node server.js file.txt

端末からパスを渡すにはどうすればよいですか?反対側でそれをどのように読み取るのですか?


コマンドラインでさらにオプションを追加する場合は、Optimistを使用できます。
Jess

stackoverflow.com/questions/6156501/…は、テキストファイルを読み取る別の方法を示しています
Marc Durdin

回答:


172

あなたは、使用したいと思うprocess.argvファイル名と取得するには、コマンドライン引数にアクセスするための配列をファイルシステムモジュール(FS)を、ファイルを読むために。例えば:

// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
  console.log('Usage: node ' + process.argv[1] + ' FILENAME');
  process.exit(1);
}
// Read the file and print its contents.
var fs = require('fs')
  , filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
  if (err) throw err;
  console.log('OK: ' + filename);
  console.log(data)
});

それを少し分解するprocess.argvと、通常は長さが2になります。0番目の項目は「ノード」インタープリターであり、最初の項目はノードが現在実行しているスクリプトで、その後の項目はコマンドラインで渡されます。argvからファイル名をプルしたら、ファイルシステム関数を使用してファイルを読み取り、その内容に対して必要なことをすべて実行できます。使用例は次のようになります。

$ node ./cat.js file.txt
OK: file.txt
This is file.txt!

[編集] @wtfcoderが言及fs.readFile()しているように、コールバック関数に渡す前にファイルのコンテンツ全体をバッファリングするため、 " "メソッドを使用することは最善の方法ではない場合があります。このバッファリングは、潜在的に大量のメモリを使用する可能性がありますが、より重要なことに、node.jsのコア機能の1つである非同期イベントI / Oを利用しません。

大きなファイル(または実際には任意のファイル)を処理する「ノード」の方法fs.read()は、オペレーティングシステムから利用できるように、利用可能な各チャンクを使用して処理することです。ただし、このようにファイルを読み取るには、独自の(場合によっては)ファイルの増分解析/処理を行う必要があり、ある程度のバッファリングは避けられない場合があります。


すごい、ありがとう、とても役に立った。このデータを行ごとに分割するにはどうすればよいですか?
空想

10
@fancy:試行するとvar lines = data.split(/\r?\n/);、配列「行」に各行が含まれます。
maerics

1
テキストファイルが大きい場合、これはすべてメモリに読み込まれるため、これは良い考えではありません。たとえば、1000 MBのCSVファイルでfs.createFilestreamを確認すると、データのチャンクとして行分割を行う必要があります。ライン境界上の文句を言わない(ほとんどの場合)秋(一部の人が既に解決策を思い付いている-グーグル)
マット・フリーマン

1
@wtfcoder:はい、非常に良い点です。私の目的は、コマンドラインで指定されたファイルを読み取る単純なケースを示すことだけでした。明らかに、この質問の範囲を超えている多くの微妙な点(特にパフォーマンス)があります。
maerics 2012

ストリームを使用して非常に大きなファイルを同期的に解析するための同様の質問に対する解決策を投稿しました。参照:stackoverflow.com/questions/16010915/…–
Gerard、

35

ノードにfsign fs。

var fs = require('fs');

try {  
    var data = fs.readFileSync('file.txt', 'utf8');
    console.log(data.toString());    
} catch(e) {
    console.log('Error:', e.stack);
}

これは同期バージョンであることに注意してください。
Rich Werden 2018

@RichWerdenこの文脈で「同期」とはどういう意味ですか?
Json

1
ノードでは、何かが「同期」している場合、システムが他のことを行うのを停止/ブロックします。あなたがノードウェブサーバーを持っているとしましょう-上記が起こっている間に他のリクエストが来た場合、サーバーはファイルの読み込みで忙しいので応答しません/できません。
Rich Werden

27

IMHO、fs.readFile()それはメモリ内のすべてのファイルをロードし、すべてのファイルが読み取られるまでコールバックを呼び出さないため、回避する必要があります。

テキストファイルを読み取る最も簡単な方法は、1行ずつ読み取ることです。私はBufferedReaderをお勧めします:

new BufferedReader ("file", { encoding: "utf8" })
    .on ("error", function (error){
        console.log ("error: " + error);
    })
    .on ("line", function (line){
        console.log ("line: " + line);
    })
    .on ("end", function (){
        console.log ("EOF");
    })
    .read ();

.propertiesやjsonファイルなどの複雑なデータ構造の場合、パーサーを使用する必要があります(内部的には、バッファーリーダーも使用する必要があります)。


7
このテクニックを指摘していただきありがとうございます。これが最善の方法かもしれませんが、私はこの質問のコンテキストでは少し混乱していると思っただけです。上記で指摘したように、コマンドラインツールに渡されるファイルが小さい場合は、fs.readFile()またはを使用しない理由はありませんfs.readFileSync()。大きな待機を引き起こすには巨大なファイルでなければなりません。package.jsonのようなA JSONの設定ファイルは、1キロバイトの下である可能性が高いので、あなただけのことができますfs.readFile()し、JSON.parse()それ。
John Starr Dewar 2013年

1
BufferedReaderの署名が変更された可能性があります。BufferedReaderをモジュールとして、BufferedReaderをBufferedReader、DataReaderに置き換える必要がありました。github.com/Gagle/Node-BufferedReaderを
bnieland

13
BufferedReaderは非推奨になりました。
Marc Rochkind

6

readstreamとpipeを使用して、一度にすべてのファイルをメモリに読み込むことなく、ファイルを1行ずつ読み取ることができます。

var fs = require('fs'),
    es = require('event-stream'),
    os = require('os');

var s = fs.createReadStream(path)
    .pipe(es.split())
    .pipe(es.mapSync(function(line) {
        //pause the readstream
        s.pause();
        console.log("line:", line);
        s.resume();
    })
    .on('error', function(err) {
        console.log('Error:', err);
    })
    .on('end', function() {
        console.log('Finish reading.');
    })
);

5

私はようやく動作した完全な例を投稿しています。ここではrooms/rooms.txtスクリプトからファイルを読み込んでいますrooms/rooms.js

var fs = require('fs');
var path = require('path');
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8');
let data = ''
readStream.on('data', function(chunk) {
    data += chunk;
}).on('end', function() {
    console.log(data);
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.