用于表示DBF(CDX)索引的编码

时间:2018-06-07 14:40:14

标签: python postgresql visual-foxpro dbf pgloader

我正在尝试使用开源解决方案从几个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个文件\索引。

0 个答案:

没有答案