2012-11-21 30 views
1

我有一個Postgresql轉儲(使用pg_dump,自定義壓縮格式創建)。我想pg_restore它到標準輸出,但用管道替換標籤分隔。我已經嘗試過使用tr通過管道,但是我確實有大量實際包含標籤的文本字段,並且tr顯然不尊重引號。有數以百億計的輸出行(壓縮文件大於500 GB),所以我確實需要一個相對有效的解決方案。pg_restore delimiter

+0

聽起來像這個轉儲只包含一個表。正確?無論如何,簡單(但不一定是快速)的方法當然是恢復到PostgreSQL數據庫,然後使用'\ copy(SELECT格式('%s |%s |%s',col1,col2,co3)在'psql'中。 –

+0

感謝您的評論克雷格。實際上我有多個表格,不管我認爲你提出的解決方案會花費太長時間。 – alex

+0

現在我正在玩python csv,但我認爲它實際上太慢了。 – alex

回答

0

你最好的選擇是使用

COPY tablename TO STDOUT WITH CSV DELIMITER '|'; 

從數據庫裏面做這個,而不是使用您的轉儲文件。

第二個選項是使用--inserts開關執行新轉儲,然後解析以INSERT開頭的行。這也會很慢。

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進行編譯,並通過生成的程序進行編譯。