2013-08-25 3 views
-1

Я ввожу большие объемы данных в базу данных PostgreSQL с использованием Perl и Perl DBI. Я получаю ошибки, так как мой файл неправильно закодирован. У меня установлен кодировка PostgreSQL на «utf8» и используется команда debian «file», чтобы определить, что мой файл имеет «текст без ISO-ASCII с очень длинными строками с терминаторами строк CRLF», и когда я запускаю свою программу DBI выходит из строя из-за «неправильной последовательности байтов». Я уже добавил строку в моей программе Perl, чтобы передать карету '\ r' для ничего, но как я могу конвертировать мои файлы в 'utf8' или получить PostgreSQL для принятия моей кодировки файлов. Благодарю.Изменение кодировки файла для PostgreSQL с Perl

+0

'File' не будет надежно определить кодировку. Вам действительно нужно знать, что такое кодировка текста, чтобы правильно ее преобразовать. Если вы действительно не поняли, попробуйте использовать инструмент, который обеспечивает более надежное обнаружение кодировки, чем 'файл'. –

ответ

1

Когда вы connect to PostgreSQL с помощью DBI->connect(..., { pg_enable_utf8 => 1}) то данные, используемые во всех модифицирующих вызовов DBI (SQL INSERT, UPDATE, DELETE, везде использовать заполнители в запросах и т.д.) должен быть закодирован во внутренней кодировке Perl, так что сама DBI может преобразовать в проводной протокол.

Существует множество способов, как вы можете достичь этого, и все они зависят от того, как вы читаете файл в первую очередь. Самый простой из них - если вы используете open (или один из методов, основанных непосредственно на нем, как IO::File->open). Затем вы можете использовать уровни ввода/вывода Perl (см. Ссылку open выше), и пусть Perl сделает это за вас. Если предположить, что ваш файл кодируется в UTF-8 уже вы будете уйти с:

open(my $fh, "<:encoding(UTF-8)", "filename"); 
while (my $line = <$fh>) { 
    # process query 
} 

Это в основном эквивалентно открытия файла без слоя кодирования и преобразования вручную с помощью Encode::decode, например, как это:

open(my $fh, "<", "filename"); 
while (my $line = <$fh>) { 
    $line = Encode::decode('UTF-8', $line); 
    # process query 
} 

Много других модулей, которые получают данные из внешних источников и вернуть его (думать о загрузке HTTP с LWP, например) возвращаемые значения, которые уже были преобразованы во внутреннюю кодировку Perl.

Так что вы должны сделать, это:

  • Выяснить, который кодирующая файл на самом деле использует (попробуйте использовать iconv на оболочке для этого)
  • Говори DBI для включения UTF-8
  • Open файл с правильной кодировкой
  • чтение линией (линиями), процесс запросом, повторите
Смежные вопросы