有一种很好的方法可以将大型CSV(4GB +)以流形式放入NodeJS的postgres数据库中吗?
特别是,我想采取第一行(标题行)并制作一个创建查询。然后,我想将文件的其余部分流式传输到语句中的副本。
如果我只想发送复制命令,这将是可行的,例如:
function copyStreamIntoTable (inputStream) {
var deferred = Q.defer();
pg.connect("pg://postgres@localhost/npi_demo", function (err, client) {
var s = client.copyFrom("COPY hptc (code, type, classification, specialization, definition, notes) FROM STDIN WITH CSV HEADER");
inputStream.pipe(through(function (data) {
this.queue(data.toString("ascii"));
})).pipe(s).on('close', function () {
deferred.resolve();
});
});
return deferred.promise;
}
但是我希望流能够读取第一行,然后运行创建查询。创建查询完成后,id就像将流的其余部分流式传输到copyFrom。
有优雅的方法吗?我仍然是nodejs和stream的相对新人。
答案 0 :(得分:0)
找出对我的问题更广泛的答案:
var fs = require('fs'),
through = require('through'),
split = require('split');
var inFile = fs.createReadStream('./lines'),
outFile = fs.createWriteStream('./out'),
headers;
var th = through(function (data) {
if (typeof headers === "undefined") {
headers = data;
th.pause();
setTimeout(function () { th.resume(); }, 5000);
} else {
this.queue(data + "\n");
}
});
inFile.pipe(split())
.pipe(th)
.pipe(outFile)
.on("close", function () {
console.log("had headers: " + headers);
});
通过和拆分的是npm安装的流助手。
如果inFile的内容是:
one
two
three
输出为had headers: one
,outFile将包含内容
two
three
在我的具体问题的上下文中 - 超时将被查询db替换为创建表,写入out文件将被替换为写入copyFrom流。