2012-06-02 2 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