Как импортировать данные фиксированной ширины в таблицу POSTGRESQL с помощью команды копирования

Я пытаюсь импортировать данные из текстового файла с фиксированной шириной в таблицу Postgres с помощью команды COPY. Указанный файл содержит приблизительно миллион записей шириной 1450 символов, большинство из которых являются пустыми пространствами с полезными данными, разбросанными в заранее определенных местах в каждой строке.

При использовании команды COPY PSQL выдает следующую ошибку.

upi=# COPY issuer (stage)
upi-# FROM 'D:/UPI_Inward.txt';
ERROR:  literal newline found in data
HINT:  Use "\n" to represent newline.
CONTEXT:  COPY issuer, line 227040

Объясните, какую ошибку он выдает, и предложите способ импорта строк из текстового файла в таблицу Postgres.

PS: таблица «эмитент», упомянутая в коде, содержит два столбца ID bigint и stage character varying(1460), и я ожидаю, что PSQL импортирует каждую строку как одну запись с присвоенным ей идентификационным номером.


person M D S R Kumar    schedule 01.04.2020    source источник
comment
Кажется, у вас есть записи, которые занимают более одной строки во входном файле.   -  person a_horse_with_no_name    schedule 01.04.2020
comment
Под фиксированной шириной вы имеете в виду, что данные не имеют разделителей или разделителей, вы просто идентифицируете записи и поля путем подсчета байтов? В таком случае COPY не поддерживает данные фиксированной ширины. Вам придется использовать другой инструмент, чтобы переформатировать данные в формат, который принимает COPY.   -  person jjanes    schedule 01.04.2020
comment
@jjanes Верно. Данные не имеют разделителей или разделителей, и необходимые записи должны быть извлечены путем подсчета байтов. Если нам удастся импортировать каждую строку как запись в таблицу эмитента, извлечение данных из этих строк может быть очень простым.   -  person M D S R Kumar    schedule 01.04.2020
comment
@a_horse_with_no_name Длина каждой строки ровно 1452 байта, а затем начинается новая строка. Как я упоминал ранее, каждая строка заполнена множеством пробелов, а полезные данные разбросаны по фиксированным позициям.   -  person M D S R Kumar    schedule 01.04.2020
comment
Команда COPY не может работать со столбцами фиксированной ширины, для нее требуется разделитель. Единственное, что вы могли сделать, - это импортировать все в промежуточную таблицу с одним столбцом text. Затем используйте функции обработки строк SQL и Postgres (например, substr()), чтобы разделить значение и вставить в реальную таблицу.   -  person a_horse_with_no_name    schedule 01.04.2020


Ответы (1)


Я считаю, что сообщение об ошибке, о котором вы сообщаете (для ввода в формате TEXT), возможно только в том случае, если ваш файл имеет несовместимые терминаторы строки (использование \ r, или \ n, или \ r \ n). Первым, что он увидел, был \ r, поэтому теперь он настаивает на его использовании в остальной части файла.

Либо вы переключились на использование \ n в качестве ограничителя строки, либо вы попытались встроить буквальный символ новой строки в середину строки. В первом случае этого делать нельзя. Во втором случае вам нужно заменить буквальный перевод строки на двухсимвольную escape-последовательность \n. (Вы можете просто вставить обратную косую черту перед буквальным символом новой строки, но это не рекомендуется)

person jjanes    schedule 02.04.2020