Какую кодировку использовать для представления индексов DBF (CDX) - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь извлечь данные из нескольких таблиц FoxPro, используя решение с открытым исходным кодом.Существует несколько .dbf таблиц и связанных .cdx индексов.Проблема в том, что два столбца в таблицах состоят из символов, которые не являются стандартными символами.Эти столбцы являются внешними ключами других таблиц.Чтобы извлечь данные, мне нужен способ / программа для распознавания этих символов, чтобы можно было выполнять объединения.

Похоже, проблема в поиске правильной кодировки для ключей.Тем не менее, я включил подробности о моих различных попытках на случай, если я слишком далеко в кроличьей норе, чтобы найти лучшее решение.

1.Модуль Python dbf

Больше всего мне повезло с модулем Python dbf.Я могу сделать следующее и увидеть ключи:

import dbf
tbl = dbf.Table('table.dbf')
tbl.open()
print(tbl[1])

  0 - f_key1 : '\x00\x00\x01'
  1 - f_key2: '\x00\x01'
  2 - some_data1: ' 64'
  3 - some_data2: ' 13'  

Я попытался экспортировать эти данные, но получил ошибку:

dbf.export(tbl, filename='table.csv', format='csv', header=True)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2: character maps to <undefined> 

Я не знаю, какую кодировку использовать.

2.pgdbf

Другой подход, который я использовал, заключался в установке pgdbf (версия 0.6.2) на Debian VirtualBox.Это позволило мне преобразовать таблицы в Postgres.Я использовал настройки по умолчанию,

pgdbf -c -e -n -Q -t table.dbf > table.pgsql

Кажется, однако, что столбцы внешнего ключа не были преобразованы.Столбцы выглядят пустыми, и выполнение внешнего объединения создает гораздо больший результат, чем следует.У меня есть результаты объединения, выполненного с использованием FoxPro на двух из таблиц.Одна таблица имеет 650404 строки, а другая - 149253. В результате полного внешнего объединения двух внешних ключей получена таблица 650404.

Код FoxPro был

SELECT Table1.id1, Table2.id2;
FROM ;
3Q04!TABLE1 ;
FULL JOIN 3Q04!TABLE2 ;
ON  Table1.f_key1 = Table2.f_key1;
AND  Table1.f_key2 = Table2.f_key2

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

Запрос Postgres был

create view t1_t2 as
  select
      d.id as id1
    , e.id as id2
  from table1 d
  full outer join table2 e
  on d.f_key1 = e.f_key1
  and d.f_key2 = e.f_key2
;

3.pgloader

Я начал играть с pgloader, но, похоже, он также не может напрямую обрабатывать .cdx файлы \ индексы.

...