2012-11-15 94 views
8

我不知道如何做到這一點。我應該從哪裏開始?我已經搜索了這個,並沒有一個結果就如何從文本文件中拉出一個隨機行。從文件中擷取隨機行

我發現的唯一的事情是https://github.com/chrisinajar/node-rand-line,但它不起作用。我如何從文本文件中讀取一行隨機文本?

+1

到底有多大這個文件?一個簡單的方法是讀取整個文件,然後選擇一個隨機行。但是,這至少需要與文件一樣多的內存。 – Brad

+0

@Brad文件是2MB – mike

+0

2MB?只是把它讀入內存中 – Dmitry

回答

9

你可能會想看看Node.js的標準庫函數讀取文件,fs.readFile,並與沿東西線結束:

//note this will be async 
function getRandomLine(filename){ 
    fs.readFile(filename, function(err, data){ 
    if(err) throw err; 
    var lines = data.split('\n'); 
    /*do something with */ lines[Math.floor(Math.random()*lines.length)]; 
}) 
} 

如果讀了整個事情和劈裂ISN」如果想要一個選項,那麼可以看看this stack overflow

+1

這對我來說並沒有馬上工作,我得到了錯誤:'data.split不是函數'。在[這個問題]的答案(http://stackoverflow.com/questions/10145946/what-is-causing-the-following-error-string-split-is-not-a-function-in-javascr)之後,我加了'data + =''',它工作。 –

3

我沒有節點方便的測試代碼,所以我不能給你確切的代碼,但我會做這樣的事情:

  1. 獲取以字節爲單位的文件大小,選擇一個隨機字節偏移
  2. 打開文件作爲流
  3. 使用this snippet發射線(或readline,但最後我用它有一個討厭的臭蟲,它基本上是沒有工作)
  4. 跟蹤你的位置在文件中當你閱讀。當您傳遞您選擇的偏移量時,請選擇該線並將其返回。

請注意,這不完全是隨機的。更長的行會被加權得更重,但它是在不讀取整個文件以獲取行數的唯一方法。

該方法允許您在不將整個文件保存在內存中的情況下獲取「隨機」行。

+0

應該指出的是,node.js OS特定的EOL標記可以通過os.EOL訪問 – saintedlama

0

我可以給你一個建議,因爲我沒有使用buffered reader

  • 商店每行一個字符串數組
  • 任何演示代碼

    1. 逐行讀取文件中的行創建方法int returnRandom(arraySize)
    2. 將數組大小傳入函數
    3. 計算0arraySize之間的一個隨機數
    4. 返回從字符串數組中的隨機數
    5. 打印出給定指標