2012-06-02 53 views
17

我從來沒有用javascript來逐行讀取文件,而phantomjs對我來說是一個全新的遊戲。我知道幻象中有一個read()函數,但我不完全確定如何在將數據存儲到變量後操作數據。我的僞代碼是一樣的東西:phantomjs javascript按行讀取本地文件行

filedata = read('test.txt'); 
newdata = split(filedata, "\n"); 
foreach(newdata as nd) { 

    //do stuff here with the line 

} 

如果任何人都可以,請幫助我真正的代碼的語法,我有點困惑,phantomjs是否會接受典型的JavaScript或什麼。

回答

27

我不是的JavaScript或PhantomJS專家,但下面的代碼工作對我來說:

/*jslint indent: 4*/ 
/*globals document, phantom*/ 
'use strict'; 

var fs = require('fs'), 
    system = require('system'); 

if (system.args.length < 2) { 
    console.log("Usage: readFile.js FILE"); 
    phantom.exit(1); 
} 

var content = '', 
    f = null, 
    lines = null, 
    eol = system.os.name == 'windows' ? "\r\n" : "\n"; 

try { 
    f = fs.open(system.args[1], "r"); 
    content = f.read(); 
} catch (e) { 
    console.log(e); 
} 

if (f) { 
    f.close(); 
} 

if (content) { 
    lines = content.split(eol); 
    for (var i = 0, len = lines.length; i < len; i++) { 
     console.log(lines[i]); 
    } 
} 

phantom.exit(); 
5

雖然爲時已晚,這裏是我曾嘗試和工作:

var fs = require('fs'), 
    filedata = fs.read('test.txt'), // read the file into a single string 
    arrdata = filedata.split(/[\r\n]/); // split the string on newline and store in array 

// iterate through array 
for(var i=0; i < arrdata.length; i++) { 

    // show each line 
    console.log("** " + arrdata[i]); 

    //do stuff here with the line 
} 

phantom.exit(); 
+0

如果下一個進程需要整個文件,這很好。否則,讀取整個文件並不是一個好主意(特別是當輸入文件很大時) –

21
var fs = require('fs'); 
var file_h = fs.open('rim_details.csv', 'r'); 
var line = file_h.readLine(); 

while(line) { 
    console.log(line); 
    line = file_h.readLine(); 
} 

file_h.close(); 
+0

這裏更好的答案是IMO,因爲它使用內置的readLine()函數;不需要做任何事情。 –

+2

同意,這是更好的答案。不過,我會建議調整使用file_h.atEnd()作爲循環條件的答案。請參閱http://phantomjs.org/api/stream/method/read-line.html –

+1

我試過這個版本,但似乎不贊成使用readLine()方法:https://nodejs.org/api/fs.html# fs_fs_open_path_flags_mode_callback – alemol