Я пытаюсь извлечь данные из нескольких таблиц 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
файлы \ индексы.