Nodejs流式CSV,在postgres中创建表并使用COPY FROM导入

时间:2014-04-02 00:19:45

标签: node.js postgresql csv

有一种很好的方法可以将大型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的相对新人。

1 个答案:

答案 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流。