大きな固定長ファイルをPostgresにインポートしようとしています。コピーコマンドと、これに続くステージングテーブルを使用しています guide 。
問題は、このファイルに多くの異なる文字が含まれていて、区切り文字としてどちらを使用するかわからないことです。実際、単一の列のテーブルにファイルをインポートしているので、区切り文字はまったく必要ありません。
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レコードに変換します。
データに表示されないことが確かな文字がない場合は、COPY
または\copy
を使用できません。区切り文字として機能する文字を選択し、それをエスケープまたは引用符で囲み、入力ファイル内のエスケープ/引用符文字を(おそらくPROGRAMを使用して)エスケープする必要があります。または、COPY
または\copy
を使用せず、代わりにINSERT
を使用してください。
ファイルにレコード区切りとして改行があるかどうか、またはすべてのファイルが1つのレコードであり、内部の改行がリテラルであるかどうかは、質問から明らかではありません。後者でCOPY
または\copy
を使用する場合は、それもエスケープ/引用符で囲む必要があります。