pg_restore分隔符

时间:2012-11-21 01:56:59

标签: linux bash postgresql

我有一个Postgresql转储(使用pg_dump创建,自定义压缩格式)。我想将它pg_restore到STDOUT,但用管道替换制表符分隔。我试过通过tr使用管道,但我确实有大量的文本字段实际上包含制表符,而tr显然不尊重引号。有数百亿输出行(压缩文件大于500 GB),所以我需要一个相对有效的解决方案。

2 个答案:

答案 0 :(得分:1)

如果必须快,请使用C.保存

#include <stdio.h>
int main()
{
    int c, quoted = 0;
    while (c = getchar(), c != EOF)
    {
        if (c == '"') quoted = !quoted;
        if (c == '\t' && !quoted) c = '|';
        putchar(c);
    }
    return quoted;
}

即G。作为bartab.c,使用gcc bartab.c -o bartab进行编译,然后通过生成的程序。

答案 1 :(得分:0)

您最好的选择是使用

COPY tablename TO STDOUT WITH CSV DELIMITER '|';

从db内部执行此操作,而不是使用转储文件。

第二个选项是使用--inserts开关执行新转储,然后解析以INSERT开头的行。这也会很慢。