web-dev-qa-db-ja.com

Postgres \ copyコマンドを区切り文字なしで単一列に

大きな固定長ファイルをPostgresにインポートしようとしています。コピーコマンドと、これに続くステージングテーブルを使用しています guide

問題は、このファイルに多くの異なる文字が含まれていて、区切り文字としてどちらを使用するかわからないことです。実際、単一の列のテーブルにファイルをインポートしているので、区切り文字はまったく必要ありません。

1
Giacomo Ronconi

Postgresはそのフォーマットを処理できませんが、CSVをキャンドルにすることができ、変換はかなり簡単です。

sed 's/"/""/g;s/^\|$/"/g'は、テキストファイルを単一列のCSVファイルに変換し、コピーで読み取ることができます。

インポートは次のようになります

sed 's/"/""/g;s/^\|$/"/g'_yourfile_ | psql _yourdatabase_ -C copy _yourtable_ from stdin with CSV

sed 's/"/""/g;1 s/^/"/;$ s/$/"/'は、代わりにテキストファイルを単一のCSVレコードに変換します。

1
Jasen

データに表示されないことが確かな文字がない場合は、COPYまたは\copyを使用できません。区切り文字として機能する文字を選択し、それをエスケープまたは引用符で囲み、入力ファイル内のエスケープ/引用符文字を(おそらくPROGRAMを使用して)エスケープする必要があります。または、COPYまたは\copyを使用せず、代わりにINSERTを使用してください。

ファイルにレコード区切りとして改行があるかどうか、またはすべてのファイルが1つのレコードであり、内部の改行がリテラルであるかどうかは、質問から明らかではありません。後者でCOPYまたは\copyを使用する場合は、それもエスケープ/引用符で囲む必要があります。

0
jjanes