2013-06-27 64 views
0

我有一個txt文件包含:轉換從文本文件中的文本陣列FS [節點JS]

{「日期」:「2013年6月26日」,「聲明」:「插入」 ,「nombre」:1} {「date」:「2013/06/26」,「statement」:「insert」,「nombre」:1} {「date」:「2013/06/26」,「聲明 「:」 選擇」, 「農佈雷」:4}

我怎麼可以將文本文件的內容轉換爲數組,如:

statement = [
{「date」:「2013/06/26」,「statement」:「insert」,「nombre」:1}, {「date」:「2013/06/26」, 「statement」:「insert」,「nombre」:1}, {「date」:「2013/06/26」,「statement」:「select」,「nombre」:4},];

我使用fs模塊節點js。由於

對不起 我會解釋更詳細:

我有一個數組:

st = [ 
    {"date":"2013/06/26","statement":"insert","nombre":1}, 
    {"date":"2013/06/26","statement":"insert","nombre":5}, 
    {"date":"2013/06/26","statement":"select","nombre":4}, 
]; 

,如果我用這個代碼:

var arr = new LINQ(st) 
    .OrderBy(function(x) {return x.nombre;}) 
    .Select(function(x) {return x.statement;}) 
    .ToArray(); 

我得到我想要的結果。

插入選擇插入

但問題我的數據是在文本文件中。 任何建議和再次感謝。

+0

什麼數據是在什麼文本文件?你在這裏模棱兩可。 –

+0

我的文件內容: {「date」:「2013/06/26」,「statement」:「insert」,「nombre」:1} {「date」:「2013/06/26」,「聲明「:」插入「,」nombre「:1} .... – Fox

+0

你的問題現在*完全*不同,但我認爲你有答案可以告訴你如何從文本文件中獲取數據到數組中。 – deoxxa

回答

2

沒有理由不自己做文件解析器。這將適用於任何大小的文件:

var fs = require('fs'); 

var fileStream = fs.createReadStream('file.txt'); 

var data = ""; 

fileStream.on('readable', function() { 
    //this functions reads chunks of data and emits newLine event when \n is found 
    data += fileStream.read(); 
    while(data.indexOf('\n') >= 0){ 
    fileStream.emit('newLine', data.substring(0,data.indexOf('\n'))); 
    data = data.substring(data.indexOf('\n')+1); 
    } 
}); 

fileStream.on('end', function() { 
    //this functions sends to newLine event the last chunk of data and tells it 
    //that the file has ended 
    fileStream.emit('newLine', data , true); 
}); 

var statement = []; 

fileStream.on('newLine',function(line_of_text, end_of_file){ 
    //this is the code where you handle each line 
    // line_of_text = string which contains one line 
    // end_of_file = true if the end of file has been reached 
    statement.push(JSON.parse(line_of_text)); 
    if(end_of_file){ 
       console.dir(statement); 
       //here you have your statement object ready 
    } 
}); 
+0

我編輯我的問題。對不起 – Fox

+0

就是這樣。非常感謝。 – Fox

+0

YW ..但是deoxxa指出,把JSON解析器放在try {} catch {}是很好的,所以它不會從格式不正確的JSON中崩潰 –

0
fs.readFileSync("myfile.txt").toString().split(/[\r\n]/) 

這麼一來,你的每一行作爲一個字符串

然後可以使用UnderscoreJS或您自己的for循環到JSON.parse("your json string")方法應用到陣列中的每個元素。

+0

我編輯我的問題。對不起 – Fox

2

如果它是一個小文件,你可能會擺脫這樣的:

// specifying the encoding means you don't have to do `.toString()` 
var arrayOfThings = fs.readFileSync("./file", "utf8").trim().split(/[\r\n]+/g).map(function(line) { 
    // this try/catch will make it so we just return null 
    // for any lines that don't parse successfully, instead 
    // of throwing an error. 
    try { 
    return JSON.parse(line); 
    } catch (e) { 
    return null; 
    } 
// this .filter() removes anything that didn't parse correctly 
}).filter(function(object) { 
    return !!object; 
}); 

如果是較大的,你可能要考慮的行由行中使用多個模塊中的任何一個閱讀它在npm上消耗流中的線。

想看看如何做到這一點與流?讓我們看看我們如何用流來完成它。這不是一個實際的例子,但無論如何它很有趣!

var stream = require("stream"), 
    fs = require("fs"); 

var LineReader = function LineReader(options) { 
    options = options || {}; 
    options.objectMode = true; 

    stream.Transform.call(this, options); 

    this._buffer = ""; 
}; 
LineReader.prototype = Object.create(stream.Transform.prototype, {constructor: {value: LineReader}}); 

LineReader.prototype._transform = function _transform(input, encoding, done) { 
    if (Buffer.isBuffer(input)) { 
    input = input.toString("utf8"); 
    } 

    this._buffer += input; 

    var lines = this._buffer.split(/[\r\n]+/); 

    this._buffer = lines.pop(); 

    for (var i=0;i<lines.length;++i) { 
    this.push(lines[i]); 
    } 

    return done(); 
}; 

LineReader.prototype._flush = function _flush(done) { 
    if (this._buffer.length) { 
    this.push(this._buffer); 
    } 

    return done(); 
}; 

var JSONParser = function JSONParser(options) { 
    options = options || {}; 
    options.objectMode = true; 

    stream.Transform.call(this, options); 
}; 
JSONParser.prototype = Object.create(stream.Transform.prototype, {constructor: {value: JSONParser}}); 

JSONParser.prototype._transform = function _transform(input, encoding, done) { 
    try { 
    input = JSON.parse(input); 
    } catch (e) { 
    return done(e); 
    } 

    this.push(input); 

    return done(); 
}; 

var Collector = function Collector(options) { 
    options = options || {}; 
    options.objectMode = true; 

    stream.Transform.call(this, options); 

    this._entries = []; 
}; 
Collector.prototype = Object.create(stream.Transform.prototype, {constructor: {value: Collector}}); 

Collector.prototype._transform = function _transform(input, encoding, done) { 
    this._entries.push(input); 

    return done(); 
}; 

Collector.prototype._flush = function _flush(done) { 
    this.push(this._entries); 

    return done(); 
}; 

fs.createReadStream("./file").pipe(new LineReader()).pipe(new JSONParser()).pipe(new Collector()).on("readable", function() { 
    var results = this.read(); 

    console.log(results); 
}); 
+0

我編輯我的問題。對不起 – Fox

+0

真的嗎? -1?關於我的回答有什麼問題的描述會很好。 – deoxxa

+0

哈哈對不起...我的壞..想要+1:v –