13

これを行う方法がわかりません。どこから始めればよいですか?私はこれをグーグルで調べましたが、テキストファイルからランダムな行を引き出す方法についての結果は1つもありませんでした.

私が見つけた唯一のものはhttps://github.com/chrisinajar/node-rand-lineですが、機能しません。テキストファイルからランダムな行を読み取るにはどうすればよいですか?

4

4 に答える 4

12

おそらく、ファイルを読み取るための node.js 標準ライブラリ関数fs.readFileを調べて、次の行に沿って何かを作成することをお勧めします。

const fs = require("fs");
// note this will be async
function getRandomLine(filename, callback){
  fs.readFile(filename, "utf-8", function(err, data){
    if(err) {
        throw err;
    }

    // note: this assumes `data` is a string - you may need
    //       to coerce it - see the comments for an approach
    var lines = data.split('\n');
    
    // choose one of the lines...
    var line = lines[Math.floor(Math.random()*lines.length)]

    // invoke the callback with our line
    callback(line);
 })
}

全体を読んで分割することができない場合は、このスタックオーバーフローを見てアイデアを探してください。

于 2012-11-15T05:40:57.443 に答える
3

コードをテストするのに便利なノードがないので、正確なコードを提供することはできませんが、次のようにします。

  1. ファイルサイズをバイト単位で取得し、ランダムなバイトオフセットを選択します
  2. ファイルをストリームとして開きます
  3. このスニペットを使用して行を出力します(またはreadlineですが、最後に使用したところ、本質的に機能しない厄介なバグがありました)
  4. 読みながら、ファイル内の自分の位置を追跡します。選択したオフセットを渡すときに、その行を選択して返します。

これは完全にランダムではないことに注意してください。長い行はより重く重み付けされますが、行数を取得するためにファイル全体を読み取らずにそれを行う唯一の方法です。

このメソッドを使用すると、ファイル全体をメモリに保持せずに「ランダムな」行を取得できます。

于 2012-11-15T05:44:01.273 に答える
0

私はデモコードを持っていないので、あなたに提案することができます

  1. を使用してファイルを1行ずつ読み取りますbuffered reader
  2. すべての行を String 配列に格納する
  3. メソッドを作成するint returnRandom(arraySize)
  4. 配列サイズを関数に渡します
  5. ~の間の乱数を計算0するarraySize
  6. 乱数を返す
  7. 文字列配列から指定されたインデックスを出力します
于 2012-11-15T06:03:56.393 に答える