Копирование postgre json от внешнего файла
Я делаю следующие действия скачиваю файл и распаковываю:
/usr/bin/curl -s http://download.companieshouse.gov.uk/en_pscdata.html | grep --color=auto zip | grep "psc-snapshot" | awk -F\" '{print "http://download.companieshouse.gov.uk/"$2}' > download_list.txt
/usr/bin/wget -i download_list.txt
mkdir psc
unzip psc-snapshot-*_1of*.zip -d psc
В результате у меня 6 гб файл где каждая строчка это json я хочу ее обработать через postgre напрямую в базу данных
создаю таблицу
CREATE TEMP TABLE psc_data_staging_temp(row_data JSON);
исполняю команду в linux:
copy psc_data_staging_temp from program 'cat /opt/upload/psc/psc-snapshot-2021-11-25_1of20.txt'
2.1 или чуть изменненную в windows:
copy psc_data_staging_temp from program 'type D:\upload\persons-with-significant-control-snapshot-2021-11-18.txt'
и я получаю ошибку:
ERROR: invalid input syntax for type json
DETAIL: Escape sequence "\O" is invalid.
CONTEXT: JSON data, line 1: ...9117131","data":{"address":{"address_line_1":"C\O...
COPY psc_data_staging_temp, line 275790, column row_data: "{"company_number":"09117131","data":{"address":{"address_line_1":"C\O Stocktake Uk Limited","address..."
SQL state: 22P02
Как ее избежать?
Ответы (2 шт):
COPY требует определённый формат данных.
Selects the data format to be read or written: text, csv (Comma Separated Values), or binary. The default is text.
Под text и binary подразумеваются строго те форматы данных, которые формирует сам COPY при выгрузке данных из таблицы, но не какие-то произвольные.
Реализуйте построчное чтение файла какими-то внешними средствами. Что-то небольшое можно было бы через pg_read_file прочитать и разбить на строки, но не 6гб файл.
Я смог решить эту проблему через cat
'COPY psc_data_staging_temp FROM program ''cat %s'''
Полный код выглядит так:
EXECUTE FORMAT('COPY psc_data_staging_temp FROM program ''cat %s''', in_path);