1

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

4

2 回答 2

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;
}

例如,作为 bartab.c,使用 编译gcc bartab.c -o bartab并通过生成的程序进行管道传输。

于 2013-11-19T13:06:20.910 回答
0

你最好的选择是使用

COPY tablename TO STDOUT WITH CSV DELIMITER '|';

从数据库内部执行此操作,而不是使用您的转储文件。

第二种选择是使用 --inserts 开关进行新的转储,然后解析以 INSERT 开头的行。那也会很慢。

于 2013-04-13T08:09:14.337 回答