2014-02-28 79 views
0

我有一個文本文件,其中包含大量值,我希望使用node.js fs模塊將其轉換爲有意義的JSON。如何讀取文件,存儲數據然後編寫它

我想存儲數組中每行的第一個值,除非該值已經存在。

7000111,-1.31349,36.699959,1004, 
7000111,-1.311739,36.698589,1005, 
8002311,-1.262245,36.765884,2020, 
8002311,-1.261135,36.767544,2021, 

因此,對於這種情況下,我想寫入文件:

[7000111, 8002311]

這裏是我到目前爲止所。它將[]寫入文件。

var fs = require('fs'); 
var through = require('through'); 
var split = require('split'); 
var shape_ids = []; 

var source = fs.createReadStream('data/shapes.txt'); 
var target = fs.createWriteStream('./output3.txt'); 

var tr = through(write, end); 

source 
    .pipe(split()) 
    .pipe(tr) 

// Function definitions 

function write(line){ 
    var line = line.toString(); 
    var splitted = line.split(','); 

    // if it's not in array 
    if (shape_ids.indexOf(splitted[0]) > -1){ 
     shape_ids.push(splitted[0]); 
    } 
} 

function end(){ 
    shape_ids = JSON.stringify(shape_ids); 
    target.write(shape_ids); 
    console.log('data written'); 
} 

的代碼使用splitthrough模塊

如何存放值數組中,並編寫填充陣列的文件嗎?

== === ====== =================

更新: 這就是我想做的事,但它在Ruby中:

shape_ids = [] 

File.open("data/shapes.txt").readlines.each do |line| 
    data = line.split(',') 
    shape_id = data.first 

    if !shape_ids.include? shape_id 
     shape_ids.push(shape_id) 
    end 
end 

puts shape_ids # array of unique shape_ids 

我可以在JavaScript中做到這一點嗎?

+1

那麼問題是什麼? – Pointy

+0

如何在數組中存儲值並將填充數組寫入文件? –

+0

文本文件中有多少條記錄?百萬?十億? –

回答

1

除非你是在節點的新流API超舒適,使用event-stream模塊來實現:

var fs = require('fs'); 
var es = require('event-stream'); 

function getIds(src, target, callback) { 
    var uniqueIDs = []; 
    es.pipeline(
    fs.createReadStream(src), 
    es.split(), 
    es.map(function (line, done) { 
     var id = line.split(',').shift(); 
     if (uniqueIDs.indexOf(id) > -1) return done(); 
     uniqueIDs.push(id); 
     done(null); 
    }), 
    es.wait(function (err, text) { 
     // Here we create our JSON — keep in mind that valid JSON starts 
     // as an object, not an array 
     var data = JSON.stringify({ ids: uniqueIDs}); 
     fs.writeFile(target, data, function (err) { 
     if ('function' == typeof callback) callback(err); 
     }); 
    }) 
); 
} 

getIds('./values.txt', './output.json'); 

不幸的是沒有「簡單」的方式來保持這個作爲一個純粹的流流動,所以你必須「等待」,直到數據完成過濾,然後轉換爲JSON字符串。希望有所幫助!

相關問題