我有一个包含大量值的文本文件,我希望使用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');
}
如何在数组中存储值并将填充的数组写入文件?
== === ====== =================
更新 这就是我想要做的,但它在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中执行此操作吗?
答案 0 :(得分:1)
除非您对节点中的新Stream 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字符串。希望有所帮助!