我正在尝试使用开源解决方案从几个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
我使用的另一种方法是在Debian VirtualBox上安装pgdbf
(版本0.6.2)。这允许我将表转换为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
个文件\索引。