0

我需要用 1.5 G 左右的 tsv 文件填充 PG。我计划使用流式传输和 pg-copy-stream,它适用于直接复制。然后我需要做一些转换并添加一个直通管道,但它失败了。我想这可能是一个缓冲区问题,一定有人这样做了。

原始tsvfile.txt的格式为

V1\tV2\tV3\tV4\n
V2\tV2\tV3\tV4\n

代码是

var fs = require('fs'), pg = require('pg'), es = require('es'), pgs = require('pg-copy-stream');
var filename = 'tsvfile.txt';
var pgkey = 'somepgkey';
pg.connect(pgkey, function(err, client, done){
    var query = client.query(pgs.from('COPY table1 (C1, C2, C3, C4) FROM STDIN'));
    var fstream = fs.createReadStream(filename);
    fstream.pipe(es.split())
           .pipe(es.mapSync(function(line){
                var midline = line.split('\t').map(sometransform()).join('\t');
                return midline + '\n';
                //not sure \n is necessary here
            }).pipe(query)
             .on('end', done)
             .on('err', somethingelse)
})

我得到的错误是 error: extra data after last expected column,但如果我删除前两个管道,它就可以正常工作。

4

2 回答 2

0

我要尝试的第一件事是删除 + '\n' - 这可能会弄乱新行。如果那没有帮助。第一步是创建一个不会改变任何东西的 sometransform() 函数。如果这没有错误,那么您的问题出在 sometranform() 函数中(例如,您是否在函数中添加了一个 \t ?)

于 2016-01-20T15:04:20.707 回答
0

line.split('\t').map(sometransform()).join('\t')

someTransform真的返回一个函数吗?用于转换数据?

如果答案是“否”或“什么?”,试试这个:line.split('\t').map( sometransform ).join('\t')

于 2016-01-20T15:12:43.293 回答