0

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

4

0 回答 0