Проблема в том, что ваши данные содержат "
символов, и это значение по умолчанию для QUOTE
символов в COPY ... CSV ...
(см. документация ).
выглядит так, как будто ваши данные в формате JSONи он полон ,
и "
символов, и они не заключены в кавычки и не экранированы.Я полагаю, что вам придется изменить свой CSV-файл, чтобы иметь возможность его загружать, потому что в настоящее время Redshift (и никто другой) может отличать разделитель ,
от ,
в JSON.
Как вы прочтете ниже, существует несколько вариантов структурирования вашего CSV-файла, но он сразу показывает все недостатки этого формата файлов для хранения данных - он может быть более кратким, чем, например, JSON, но приносит тонныпроблем, как только вы храните что-нибудь более сложное.После прочтения моих предложений подумайте также об изменении формата файла, напримерJSON, который имеет более четкую семантику, когда дело доходит до qouting .
Как заставить его работать с использованием CSV
Я предполагаю, что ваши CSV-данные выглядят так:
"1","app.name","{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}"
Вариант 1 - Используйте другой символ QUOTE
:
Например, используйте backtick
в качестве QUOTE
Измените ваши данные так:
`1`,`app.name`,`{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}`
Вам не нужно указывать все поля, только те, которые содержат,
.
И используйте эту команду COPY
:
psql -w -U user1 -h host1 db1 --port 123 -c \
"COPY table1 FROM 's3://bucket1/table1.csv' \
credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
IGNOREHEADER 1 \
CSV QUOTE AS '`'
NULL AS 'NULL' ;"
Вариант 2 - экранируйте свой QUOTE
символ:
Измените свои данные так, чтобы они выглядели так:
"1","app.name","{""x"":""app.name"",""en"":""dfgdggfdfdd"",""de"":""dfdddffgf Entwicklerportal"",""ja"":""fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg"",""zh-gfdd"":""gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd""}"
Таким образом, вы ясно указываете, где заканчивается поле в кавычках.Затем вы можете использовать вашу оригинальную команду COPY
.
Вариант 3 - используйте DELIMITER
, которого нет в ваших данных.
Тогда вам не нужно цитировать.Используйте, например, |
в качестве разделителя
Измените данные так, чтобы они выглядели следующим образом:
1|app.name|{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}
И используйте эту команду COPY
:
psql -w -U user1 -h host1 db1 --port 123 -c \
"COPY table1 FROM 's3://bucket1/table1.csv' \
credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
IGNOREHEADER 1 \
CSV QUOTE AS '`'
DELIMITER AS '|'
NULL AS 'NULL' ;"