Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Как изменить кодировку открываемого файла.  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Добрый день всем.

Задача следующая. Имею *.txt файлы. Часть из них создана в Debiane как utf-8 (кодировка).
Часть из них создана в Windows в кодировке (win-1251).

Открываю как
п_файл:=pg_read_file('/home/postgres/_analiz/_***_файл.txt') 


PostgreSQL работает из под Debian (Linux)
Файлы, которые имею кодировку UTF-8 без проблем открываются и анализируются.
А вот если попадается файл в кодировке Win-1251, то постгрес выдаёт ошибку:
ОШИБКА:  неверная последовательность байт для кодировки "UTF8": 0xc7 0xe4


Понимаю, что как то нужно дать команду на перекодирование. В инструкциях к PostgreSQL есть
23.3. Поддержка кодировок + convert_from + convert_to

Но ничего из этого не срабатывают.
Пытался делать клиентскую кодировку внутри функции (при импорте данных из текстового файла)
SET CLIENT_ENCODING TO 'WIN1251';

но появляется ошибка и думаю, что ошибка та же только выводится в другой кодировке
К сожалению - текст не вставляется, ниже привожу картинку.

.
Вопрос - как при открытии внешнего файла явно задать его кодировку, отличную от utf-8?
.

Сообщение было отредактировано: 2 июн 21, 10:31
2 июн 21, 10:34    [22330194]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
файл

К сообщению приложен файл. Размер - 30Kb
2 июн 21, 10:39    [22330196]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
Ы2
Member

Откуда:
Сообщений: 214
О-О-О
Вопрос - как при открытии внешнего файла явно задать его кодировку, отличную от utf-8?

Раз вы заранее знаете, что файл не в той кодировке, почему бы не перекодировать его перед тем, как отдавать PostgreSQL?
$ man iconv
2 июн 21, 10:44    [22330197]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Ы2,

Спасибо, сработало.
iconv -f WINDOWS-1251 -t UTF8 "/home/postgres/_***_файл.txt" -o /home/postgres/_***_777.txt


Но хотелось бы штатными средствами PostgreSQL.
Сейчас же придется запускать Python для запуска команды которая переведет текст из одной кодировки в другую.
.
Не совсем удобно.
.
Хочется что то от самого PostgreSQL - не поверю, чтобы такой фишки не было в PostgreSQL

.
2 июн 21, 11:27    [22330217]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
О-О-О,

Никак...
pg_read_file не предназначен для загрузки данных и никакой конверсии кодировок не делает (и делать никогда не будет) и читает файл как есть.

Для загрузки данных существует copy from file комманда (и вот там вот конверсия кодировок работает).

В 100% случаев если некоторая функция обьявлена (как pg_read_file) superuser only - она НЕ ПРЕДНАЗНАЧЕНА для реализации любой мыслимой бизнес логики а только для АДМИНИСТРИРОВАНИЯ.

В общем не забивайте гвозди микроскопом... для этого есть молоток.

PS:
документация
Note that granting users the EXECUTE privilege on pg_read_file(), or related functions, allows them the ability to read any file on the server that the database server process can read; these functions bypass all in-database privilege checks. This means that, for example, a user with such access is able to read the contents of the pg_authid table where authentication information is stored, as well as read any table data in the database. Therefore, granting access to these functions should be carefully considered.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
2 июн 21, 12:37    [22330259]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Maxim Boguk,

Проблема в том, что текстовой файл это не записи для БД - это большой файл текстовых данных (текст) который нужно проанализировать.
.
Про COPY я знаю.
Но в *.txt файле есть перевод строк. При импортировании данных через COPY выходит сообщение - в файле есть перевод строк, замените их на '\r'. и благополучно отваливается.
То есть даже не могу загрузить для замены данных.
.
Так что вариант через COPY не годится. Жать, значит буду городить костыли.

Какая кодировка попадет - я не знаю. Там все в кучу.
.

Сообщение было отредактировано: 2 июн 21, 12:44
2 июн 21, 12:50    [22330268]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Хорошо. Всем спасибо.
Суть задачи и проблему понял.

Буду думать, как обойти данное ограничение/особенности.
.
2 июн 21, 12:54    [22330270]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1312
select convert_from(pg_read_binary_file('/tmp/ff'), 'windows-1251');


Потому что pg_read_file возвращает тип text и на входе типа проверяется возможность существования таких символов.
2 июн 21, 13:47    [22330303]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить кодировку открываемого файла.  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Melkij,

Да, сработало.
Но здесь немаловажный есть нюанс.
Я почти так пробовал, но пробовал по другому:
convert_from('text_in_win1251', 'UTF8') 

Указывал из какой кодировки в какую.
Думал, что будет сделано преобразование в формат UTF-8

и пробовал
convert('text_in_utf8', 'UTF8', 'LATIN1')
convert_to('некоторый_текст', 'UTF8')
оказалось - что нужно просто было указать не в какой формат хочу перекодировать а из какого формата нужно раскодировать!


БОЛЬШОЕ СПАСИБО Melkij.
Сработало.
Но честно говоря, не понимаю, почему для бинарных файлов этот код сработал.
В общем, еще раз спасибо.
.
2 июн 21, 18:06    [22330505]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить