2012-02-06 20 views
65

端末のテキストファイルを渡してからデータを読み込む必要がありますが、どうすればいいですか?Node.jsを使用してテキストファイルを読み込みますか?

node server.js file.txt 

端末からのパスをどのように渡すのですか。反対側ではどうすれば読むことができますか?

+0

スクリプトからファイルrooms/rooms.txtに読んでいます[オプティミスト](https://github.com/substack/node-optimist )。 – Jess

+0

http://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js?rq=1テキストファイルを読み取る別の方法を示しています –

答えて

111

process.argvアレイを使用してコマンドライン引数にアクセスしてファイル名を取得し、FileSystem module (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は通常、ゼロ番目の項目は、「ノード」インタプリタとノードが現在実行されているスクリプトである第1のもの、長さ2を持つことになり、あなたのために少しそれを打破するには、それ以降の項目はなかったですコマンドラインで渡されます。 argvからファイル名を引っ張ったら、ファイルシステム関数を使ってファイルを読み込み、その内容で必要なものを実行することができます。

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

[編集] @wtfcoderが言及したようにはそれをもたらす前に、ファイルの内容全体をバッファリングするため、「fs.readFile()」メソッドを使用すると、最高のアイデアではないかもしれません:使用例は次のようになります。コールバック関数このバッファリングは大量のメモリを使用する可能性がありますが、より重要なことに、非同期イベントI/Oであるnode.jsのコア機能の1つを利用していません。

大きなファイル(または実際にはファイル)を処理する「ノード」方法は、fs.read()を使用し、オペレーティングシステムから利用可能なチャンクを処理することです。しかし、このようにファイルを読み込むには、ファイルのインクリメンタルな解析/処理を自分で行う必要があり、バッファリングの量が必然的になる可能性があります。

+0

ありがとう、ありがとうとても助かりました。このデータを行ごとに分割するにはどうすればよいですか? – fancy

+5

@fancy: 'var lines = data.split(/ \ r?\ n /);'を試してみると、配列 "lines"にはそれぞれの行があります。 – maerics

+0

いいえ、はい、ちょうど私が戻って、おかげで再びチェック! – fancy

20

IMHO、fs.readFile()は、すべてのファイルをメモリにロードし、すべてのファイルが読み込まれるまでコールバックを呼び出さないため、避けるべきです。

テキストファイルを読み込む最も簡単な方法は、行単位で読み込むことです。 (内部的にそれはまた、バッファリーダーを使用する必要があります).propertiesファイルまたはパーサーを使用する必要がJSONファイルなどの複雑なデータ構造について

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(); 

:私はBufferedReaderをお勧めします。

+6

このテクニックを指摘してくれてありがとう。あなたはこれが最善の方法かもしれないと思っていますが、私はちょうどこの質問の文脈で少し混乱していると思っていました。私は思うに、使いにくいユースケースについて質問しています。上で指摘したように、小さなファイルがコマンドラインツールに渡されるだけであれば、 'fs.readFile()'や 'fs.readFileSync()'を使わない理由はありません。目立つ待ち時間を引き起こすためには巨大なファイルにする必要があります。 package.jsonのようなJSON設定ファイルは1kb以下になる可能性が高いので、 'fs.readFile()'と 'JSON.parse()'だけで構いません。 –

+0

BufferedReaderの署名が変更されている可能性があります。 BufferedReaderをBufferedReader、DataReader、BufferedReaderをモジュールに置き換えなければならなかった。 https://github.com/Gagle/Node-BufferedReader – bnieland

+6

を参照してください。BufferedReaderは廃止予定です。 –

1

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.'); 
    }) 
); 
1

私は最終的に働いている完全な例を投稿しています。ここで私はあなた自身がコマンドライン上でより多くのオプションを追加見つけた場合、あなたが使用することができます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); 
}); 
関連する問題