2012-12-21 2 views
4

프로젝트에서 dbf 파일에 저장된 Visual FoxPro 데이터베이스에서 데이터를 추출해야합니다. y는 539 개의 파일이있는 데이터 디렉토리가 있으며, 각 파일은 데이터베이스를 나타냅니다. 테이블, 그래서 몇 가지 테스트를 해 봤는데 내 코드는 다음과 같이 진행됩니다 명백한 패턴, 항상 같은 15 표와pyodbc를 사용하여 DBF 파일 읽기

import pyodbc 

connection = pyodbc.connect("Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=P:\\Data;Exclusive=No;Collate=Machine;NULL=No;DELETED=Yes") 
tables = connection.cursor().tables() 
for _ in tables: 
    print _ 

이 인쇄 15 표,이라고 생각 때문에 나머지 테이블이 비었지만 목록에서 테이블 (dbf 파일) 중 일부가 비어있는 경우 권한 문제라고 생각했지만 모든 파일에 동일한 사용 권한 구조가 있으므로 잘 모릅니다. 여기서 일어나는 일.

빛이 있습니까 ??

편집 : 그것은 출력을 truccating되지 , 테이블이 목록에 난이 직접 질문에 대답하지 않는 것을 알고

+0

놀라운 질문과 답변에 감사드립니다. 궁금한 분은 원래의 질문 ***에있는 코드가 ** 32 비트 시스템에서 FoxPro의 이전 버전과 호환되는지 확인합니다. –

답변

6

내가 그것을했다 !!!! 내가 지금 무엇을하고 있었는지 몇 가지 문제가, 여기에 내가 제일 먼저 드라이버 문제를했다

(그것을 처음 에단 FURMAN의 솔루션으로 시간을 구현 후)을 해결하기 위해 무엇을했는지와 함께이

, 그것은 Windows의 DBF 드라이버는 32 비트 프로그램이고 64 비트 운영 체제에서 실행되므로, Python-amd64를 설치했는데 이것이 첫 번째 문제이므로 32 비트 Python을 설치했습니다.

this에 따르면 두 번째 문제는 라이브러리/파일 문제로, VFP> 7의 dbf 파일이 다르므로 pyodbc 라이브러리가 올바르게 읽을 수 없으므로 성공하지 못하고 일부 OLE DB 라이브러리를 시도한 결과 나는 처음부터 그것을하기로 결정했다.

import win32com.client 

conn = win32com.client.Dispatch('ADODB.Connection') 
db = 'C:\\Profit\\profit_a\\ARMM' 
dsn = 'Provider=VFPOLEDB.1;Data Source=%s' % db 
conn.Open(dsn) 

cmd = win32com.client.Dispatch('ADODB.Command') 
cmd.ActiveConnection = conn 
cmd.CommandText = "Select * from factura, reng_fac where factura.fact_num = reng_fac.fact_num AND factura.fact_num = 6099;" 

rs, total = cmd.Execute() # This returns a tuple: (<RecordSet>, number_of_records) 

while total: 
    for x in xrange(rs.Fields.Count): 
     print '%s --> %s' % (rs.Fields.item(x).Name, rs.Fields.item(x).Value) 
     rs.MoveNext() 
     total = total - 1 

그리고 그것은 나에게 내가 확인 (20 개) 기록을했다 : 잠시 동안 인터넷 검색

마침내 기본적으로이

에 나에게 빛을 준 this 게시물에 걸렸다, 내가 한 일은 다음이었다 OK

먼저 DBFCommander으로하고 있었다, 당신은

VFP 9.0 내 경우에는, pywin32 extensions (32 비트)와 Visual FoxPro OLE-DB Provider (32 비트에서만 사용 가능)를 설치해야합니다

또한 ADO Documentation을 w3c 웹 사이트에서 읽는 것이 좋습니다

이것은 저에게 효과적입니다. 답장을 보내 주신 분들께 진심으로 감사드립니다.

+0

축하합니다! 'win32'도 사용하는 좋은 예처럼 보입니다. –

+0

대단히 감사합니다!, 예, 그리고이 방법을 사용하면 VFP SQL 용량을 활용할 수 있으므로 모든 관계형 대수를 구현할 필요가 없으며 dbf 패키지와 PLY를 사용하여 컨텍스트 프리 문법을 구현할 수도 있습니다. 이것을 "재사용 가능한 방법"으로 해결하기 위해 – israelord

+0

이것은 아주 좋습니다! 다른 dbf 라이브러리를 시도했지만 VFP 버전이 다르므로 올바른 출력을 얻을 수없는 것 같습니다. 나는 이것이 VFP dbfs로 작업 할 때 선호되는 해결책이라고 생각합니다. 유일한 단점은 win32의 모든 것을 설치해야한다는 것입니다. – smartexpert

2

같은 15 첫 번째 또는 아무것도 아니지만, 여전히 도움이 될 수 있습니다. 나는 VFP 데이터베이스와 ODBC를 사용하여 많은 문제를 겪었으며 가능한 경우 빈 테이블로 VFP 테이블을 처리하는 것이 훨씬 쉽다는 것을 발견했습니다.

Yusdi Santoso의 dbf.py와 glob를 사용하여 디렉토리의 각 테이블을 열고 각 레코드를 실행하는 몇 가지 코드가 있습니다.

import glob 
import os 
import dbf 

os.chdir("P:\\data") 
for file in glob.glob("*.dbf"): 
    table = dbf.readDbf(file) 
    for row in table: 
     #do stuff 
+0

이 방법을 사용할 수는 있지만 어떻게 이런 식의 데이터로 작업 할 수 있습니까? 외란 키를 통해 관계식을 찾거나 열을 선택하는 방법은 무엇입니까?, 답변을 주셔서 대단히 감사합니다. – israelord

+0

기억하는 경우 데이터가 딕트 목록에 나옵니다 바르게. ''data = row [ 'FIELDNAME']'정렬을 위해 연산자를 사용하여'table.sort (key = operator.itemgetter ('FIELDNAME'))'와 같은 일을 할 수 있습니다. 외래 키는이 경우 모두 수동입니다. 이 방법으로 데이터베이스 수준이 아닌 테이블 수준에서 작업하고 있습니다. – TheSentinel

+0

대단히 고마워요. 해보았습니다. 데이터베이스 수준에서 할 수있는 방법을 찾지 못하면 이렇게 할 것입니다. – israelord

2

나는 dbf package 내 자신을 사용하고 코드는 다음과 같이 갈 것이다 : 그것은 레코드를 반환 통해

import dbf 
from glob import glob 

for dbf_file in glob(r'p:\data\*.dbf'): 
    with dbf.Table(dbf_file) as table: 
     for record in table: 
      do_something_with(record) 

테이블은리스트 등을들 수 있으며, 반복이다. 레코드는 list-, dict-, obj-like이며 반복은 값을 반환합니다. 기록을 통한 반복 외에도 개별 필드는 dict-like 액세스 (record['some_field'])를 사용하는 field-name 또는 obj.attr과 같은 액세스 (record.some_field)를 사용하는 field-name을 사용하여 오프셋 (첫 번째 필드는 record[0]) . 당신은 단지 당신이 할 수있는 csv 파일로 각 dbf 파일의 내용을 덤프하고 싶었

:

for dbf_file in glob(r'p:\data\*.dbf'): 
    with dbf.Table(dbf_file) as table: 
     dbf.export(table, dbf_file) 
+1

매우 흥미롭고 유용하며 대단히 감사합니다. CSV 내보내기 기능을 좋아합니다. 다른 dbf 도구를 사용하여 코딩했습니다. 고마워요! 이것은 나를 위해 약간의 시간을 절약했다. – israelord