Ошибка возврата каретки Postgres в Linux - PullRequest
0 голосов
/ 03 мая 2018

Спекуляции
Linux Mint 18.x
Posgres 10.x
Pgadmin3

Я пытался загрузить TSV в postgres, но получаю буквальную ошибку возврата каретки. В файле "\ N" используется для обозначения NULL.

Я пробовал как с \copy, так и с помощью диалога импорта в pgadmin3. В pgadmin3 я попытался пропустить форматирование файла, а также попытался установить его в UTF8. Ошибка все еще сохраняется.

использованная начальная команда:

\copy table FROM PROGRAM 'tail -n +2 /home/super/Downloads/folder/myfile.tsv'

ERROR; literal carriage return found in data
HINT: use "\r" to represent carriage return.

Я использовал sed для создания разных версий файла, которые заменяют то, что, по моему мнению, может вызвать ошибку:

sed 's/\n/\r/g myfile.tsv > newfile1.tsv'
sed 's/\\n/\r/g myfile.tsv > newfile2.tsv'
sed 's/\\n//g myfile.tsv > newfile3.tsv'

Я также попробовал следующее (не в хронологическом порядке)

sed 's/\r\n/\r/g' new.tsv

sed 's/\\N/NULL/g' new.tsv

sed 's/\\//' 

sed 's/\\N/\r/' 

sed -n 's/\n/\r/' 

sed -n 's/\\n/\r/' 

sed 's/\N/\r/' 

sed 's/\\N/NULL/' 

sed 's/\N/NULL/' 

sed 's/\r//' 

sed 's/\N/NULL/' 

sed 's/\\N/NULL/' 

sed 's/\\//' 

sed 's/\N/\r/g' new.tsv

sed 's/\N/NULL/g' new.tsv

sed 's/\N/NULL/g' new.tsv  

И ни один из них не сработал. Когда я просматриваю диалоговое окно предварительного просмотра LibreOffice, кажется, что оно прокручивает содержимое и форматирует его в виде таблицы.

Я смотрел на этот вопрос о буквальной ошибке новой строки и этот вопрос об использовании копии .

Я не понял, что имелось в виду, что вставлен неправильный «байт».

Предварительный просмотр данных: https://imgur.com/JPhHB52 broken tsv

ОБНОВЛЕНИЕ: запустил sed 's/\r/CR was here/g' myfile.tsv | grep 'CR was here' и вернуло два результата

1 Ответ

0 голосов
/ 03 мая 2018

Это решается с помощью: sed 's/\r//\\r/g' myfile.tsv > myfile_copy.tsv

Видимо, нужно дважды убежать.

@ Abelisto указал на ошибку, возникшую в этом комментарии:

Хорошо, есть относительно простой способ воспроизвести ошибку: echo -e 'aaa\nbbb\rccc' > foo.tsv ; psql -c 'create table foo(x text)' -c '\copy foo from foo.tsv' -c 'drop table foo;' (будьте осторожны, если вы уже есть ценная таблица Foo в вашей БД) Давайте попробуем найти, как исправить это ...

Также полезно:

echo -e 'aaa\nbbb\rccc' > foo.tsv ; sed -i 's/\r/\\r/g' foo.tsv ; psql -c 'create table foo(x text)' -c "\copy foo from foo.tsv" -c 'table foo' -c 'drop table foo;' исправил ошибку. Понятия не имею почему \ r последовательность не переводится в CR командой копирования, как указано в документация. Но это еще один вопрос. - Абелисто

...