4

ファイルを 1 行ずつ読み取り、それに応じて変数を変更する必要があります。通常はこれを PHP で記述しますが、挑戦することにしました。

私が書いた:

fs = require('fs');
Lazy = require('lazy');
path = require('path');

files = fs.readdirSync('.');
var software = {};


files.forEach( function(fileName){


  var m; 
  if( m = fileName.match(/^(.*)\.txt$/) ){
    name = m[1];

    console.log("Processing file: " + fileName);
    software[name] = {};
    console.log("Software 1: %j",software);

    var section = 'unset';
    new Lazy(fs.createReadStream(fileName)).lines.forEach(
      function(line){
        var m;
        line = line + '';
        if( m = line.match(/^([a-zA-Z_]*):$/)){
          section = m[1];
          software[name][section] = '';
          console.log("Switching to section " + m[1]);
          console.log("Software 2: %j",software);
        } else if (line == '.'){
          section = 'unset'
        } else if (line == ''){
          section = 'unset'
        } else { 
          console.log("LINE: " + line) ;
          software[name][section] = software[name][section] + line + "\n";
          console.log("Software 3: %j",software);
        }
      }

    );   
  }

});

console.log("Software 4: %j",software);

コードが非常に醜く、最適化されていないことは別として、最後の行が出力されたときに「ソフトウェア」変数がまだ入力されていないため、問題が発生しています。Lazy は非同期だと思います。したがって、基本的には機能しますが、「後で」です。これは素晴らしいことですが...ソフトウェア変数を埋める重要なサイクルが実際に終了したときに、どこにコードを記述すればよいのでしょうか?!?

リクエストに応じて: で遊ぶデータ!

「something.txt」を作成して次のように記述します。

name:
Name 1
.

Option 1:
Value 1
.

Option 2:
Value 2
.

Option 3:
Multi
Line
Value
.

Another_section:
Again
.

メルク。

4

1 に答える 1

15

ライブラリによって返される Lazy のインスタンスはEventEmitterspipeであり、操作の「セット」が完了したときに呼び出されるイベントを発行します。

new Lazy(
  ...
).on('pipe', function() {
  // all done
});

このイベントを使用するようにコードを変更すると、次のようになります (唯一の変更は下部にあります)。

fs = require('fs');
Lazy = require('lazy');
path = require('path');

files = fs.readdirSync('.');
var software = {};


files.forEach( function(fileName){


  var m;
  if( m = fileName.match(/^(.*)\.txt$/) ){
    name = m[1];

    console.log("Processing file: " + fileName);
    software[name] = {};
    console.log("Software 1: %j",software);

    var section = 'unset';
    new Lazy(fs.createReadStream(fileName)).lines.forEach(
      function(line){
        var m;
        line = line + '';
        if( m = line.match(/^([a-zA-Z_]*):$/)){
          section = m[1];
          software[name][section] = '';
          console.log("Switching to section " + m[1]);
          console.log("Software 2: %j",software);
        } else if (line == '.'){
          section = 'unset'
        } else if (line == ''){
          section = 'unset'
        } else {
          console.log("LINE: " + line) ;
          software[name][section] = software[name][section] + line + "\n";
          console.log("Software 3: %j",software);
        }
      }

    ).on('pipe', function() {
      console.log("Software 4: %j",software);
    });
  }

});

[編集] この情報を見つけた方法に関する質問に答えるには:

私は実際にプロジェクトのソース ファイルをチェックアウトしました。sumこのライブラリには、 Lazy のインスタンスにチェーンして、最後にすべてを要約できるメソッドがあることを知っていました。そのメソッドのコードは を呼び出しfoldr、そのメソッドのコードはというイベントをリッスンします。これは22 行目でとしてpipeNameデフォルト設定されています。pipe

于 2012-06-20T11:30:19.027 に答える