Страница 1 из 1

Изменение кодировки DBF

Добавлено: 01 сен 2008, 21:45
Максим Дубинин
Не подскажет ли кто-нибудь, есть ли в природе консольные утилиты для перевода DBF шейпфайлов из UTF-8 в Win-1251? Интересуют именно консольные утилиты, лучше всего под Unix, но если есть примеры под Win, то тоже пригодятся.

Re: Изменение кодировки DBF

Добавлено: 02 сен 2008, 09:55
JEY
Я тоже искал такие утилиты, была такая необходимость, но не нашел. Да и сроки сдачи проекта поджимали...

В результате пришлось дописывать специальный модуль, считывающий *.dbf "на лету", где конвертация в 1251 из UTF-8 происходила непосредственно в момент считывания файла.

Этот вариант меня вполне устроил и работает до сих пор в некоторых из моих проектов!

Re: Изменение кодировки DBF

Добавлено: 02 сен 2008, 18:32
Максим Дубинин
расскажите поподробнее про реализацию, если не сложно. Это процедура? На каком языке? Реально ли ее использовать еще где-то?

Re: Изменение кодировки DBF

Добавлено: 03 сен 2008, 09:12
JEY
Это программный код, представляющий собой объект класса DBFReader, написанный на Visual Basic .NET. Объект этого класса напрямую связан с классом SHPReader, но суть не в этом...

Принцип работы этого класса основан на непосредственном считывании файла *.dbf и представлении его содержимого в виде таблицы в памяти компьютера. Класс снабжен методами для произвольного доступа к данным (но только в режиме "чтение"), а также связывания этих данных с другими произвольными объектами классов...

Считывание данных выполняется непосредственно в 1251, а не в UTF-8.
Это не изменяет принцип его работы, поскольку промежуточных конвертаций при этом не выполняется!

Часть этого кода можно включить в свои разработки. Если возникнет необходимость, то можно включать не сам исходный код, а производную от него библиотеку функций...

И наконец, поскольку исходный код основан на платформе Microsoft .NET Framework, то лучше всего применять его в рамках Microsoft Visual Studio .NET при разработке прикладных ГИС...

Re: Изменение кодировки DBF

Добавлено: 03 сен 2008, 11:06
KolesovDmitry
sim писал(а):Не подскажет ли кто-нибудь, есть ли в природе консольные утилиты для перевода DBF шейпфайлов из UTF-8 в Win-1251? Интересуют именно консольные утилиты, лучше всего под Unix, но если есть примеры под Win, то тоже пригодятся.
В свое время у меня вставала такая же задача, только нужно было перекодировать в обратном направлении. Готовых утилит я не нашел, пришлось написать небольшой скриптик на питоне. В основе его лежит библиотека, позволяющая работать с dbf файлами на питон dbfpy.
Вот пример кода, который переконвертирует файл towns.dbf из Win-1251в UTF-8 и сохраняет результат в файл test.dbf:

Код: Выделить всё

#!/usr/bin/python
#--*-- encoding: utf-8 --*--

from dbfpy import dbf # импортируем библиотеку
from types import *

db = dbf.Dbf("towns.dbf")
newDB=dbf.Dbf("test.dbf", new=True)

for f in db.header.fields: # копируем структуру dbf-файла
  newDB.addField(f)

for rec in db: # копируем записи из одного файла в другой
  r=newDB.newRecord()
  newData=[]
  for f in rec.fieldData:
    if type(f)==StringType: # если поле символьного типа - перекодируем
      f=unicode(f,'windows-1251')
      f=f.encode('utf-8')
    newData.append(f)
  r.fieldData=newData
  r.store() # сохраняем текущую запись

db.close()
newDB.close()
Библиотека удобная, своего кода писать немного - так что рекомендую :)

Re: Изменение кодировки DBF

Добавлено: 04 сен 2008, 05:01
Максим Дубинин
супер! действительно очень удобно и работает прекрасно, большое спасибо. Я засомневался было, съест ли Arcview сконвертированный вариант, проблем не возникло.

разумеется для конвертации UTF-8->Win 1251, в коде меняем:

Код: Выделить всё

      f=unicode(f,'windows-1251')
      f=f.encode('utf-8')
на

Код: Выделить всё

      f=unicode(f,'utf-8')
      f=f.encode('windows-1251')
еще, для тех кто столкнется, я по неопытности провозился минут 10, после скачивания библиотеки - выполняем команду, которая копирует dbfpy куда надо (а именно в site-packages):

Код: Выделить всё

python setup.py install
иначе все время будем получать ошибку

Код: Выделить всё

root@ubuntu:~/src/dbfpy-2.2.1/dbfpy# python dbfer.py
Traceback (most recent call last):
  File "dbfer.py", line 4, in <module>
    from dbfpy import dbf
ImportError: cannot import name dbf

Re: Изменение кодировки DBF

Добавлено: 29 окт 2009, 14:34
azot101
Извините, у меня вопрос, как этот скрипт( код) вставить в ArcGIS?

Re: Изменение кодировки DBF

Добавлено: 29 окт 2009, 18:09
paleogis
Не буду открывать Америку. Поменять кодировку можно в QGIS при экспорте в SHP

Re: Изменение кодировки DBF

Добавлено: 11 окт 2010, 12:10
Bzzzuka
что нужно сделать чтобы это с shp сработало? Или это возможно в Qgis?

Re: Изменение кодировки DBF

Добавлено: 11 окт 2010, 13:16
Александр Мурый
В QGIS сменить кодировку файла при открытии (или при сохранении в shp).