我正在尝试使用开源解决方案从几个 FoxPro 表中提取数据。有几个.dbf
表和相关的.cdx
索引。我遇到的问题是表格中的两列由非标准字符组成。这些列是其他表的外键。为了提取数据,我需要一种方法/程序来识别这些符号,以便可以执行连接。
这似乎是为密钥找到正确编码的问题。但是,我已经详细介绍了我的各种尝试,以防我离兔子洞太远而无法看到更好的解决方案。
1.Pythondbf
模块
我对 pythondbf
模块最幸运。我可以执行以下操作并实际看到键:
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
在 Debian VirtualBox 上安装(版本 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
文件\索引。