Importazione di file XML in un DataFrame(.MDB) db è OFFLINE

di il
2 risposte

Importazione di file XML in un DataFrame(.MDB) db è OFFLINE

Salve a tutti..
Sono nuovo del forum, e volevo porvi subito un problema...
Dato che non ho più utilizzato windows dal lontano 2006, mi trovo a trattare MDB(microsoft access) di cui non conosco minimamente il funzionamente di questi DataFrame, essendo un utente linux sono ignorante in materia, se potete aiutarmi ve ne sarei grato

Dovrei importare dei file XML simili a questi:
<Export version="0.10">
<Remark LineCode="D71012148"/>
<Remark BranchCode="D7102125008D7104212928"/>
<Remark Type="R"/>
<Remark Code="303"/>
<Remark Quantity="1"/>
<Remark Accessability="AA"/>
<Remark Priority="1"/>
<Remark Latitude="39,2005277490331"/>
<Remark Longitude="8,4997620588403"/>
<Remark Note=""/>
<Remark idIMMAGINE="39.20052774903318.4997620588403303D7102125008.jpg"/>
</Export>
e questi XML dovrei inserirli in questi MDB ( gl'mdb sono già esistenti, io devo solo importare le informazioni che contiene il file xml nel suddetto MDB)
Ho provato a aprire in mille modi da python l'mdb(nonostante sia un dataframe in locale e non online, senza alcuna password o credenziale)

ho provato ad aprirlo con questo source code :

import csv
import pyodbc

MDB = 'c:/Users/BEG/Desktop/DOMENICO/prova xml/D71012148.MDB'
DRV = '{Microsoft Access Driver (*.mdb)}'


conn = pyodbc.connect('DRIVER=%s;DBQ=%s' % (DRV,MDB))
curs = conn.cursor()

SQL = 'SELECT * FROM mytable;' # insert your query here
curs.execute(SQL)

rows = curs.fetchall()

curs.close()
conn.close()

# you could change the 'w' to 'a' for subsequent queries
csv_writer = csv.writer(open('mytable.csv', 'w'), lineterminator='\n')

for row in rows:
    csv_writer.writerow(row)
    
Vi ringrazio in anticipo per qualsiasi illuminazione o risposta e scusate la mia ignoranza verso Windows, ma non lo utilizzo
Grazie del vostro duro lavoro ragazzi

2 Risposte

  • Re: Importazione di file XML in un DataFrame(.MDB) db è OFFLINE

    Chiedo scusa se sono stato un pò vago, chiarisco gli argomenti :

    - Ho un file .mdb che mi fornisce il cliente;
    - Ho dei file XML che mi genera il loro software con dei dati all'interno;
    - I dati dell'XML devo inserirli automaticamente nell'.mdb (attraverso il modulo 'pyodbc')
    - devo fare in modo che importi tutti i dati dell'xml correttamente nell'mdb

    Una specie di importazione MASSIVA, dei dati presenti negli XML, cosa che non posso fare da Microsoft Access, perchè posso importarli uno per volta..
    avete consigli o idee?
  • Re: Importazione di file XML in un DataFrame(.MDB) db è OFFLINE

    Non ho mai provato ODBC su Access, ma quello che vuoi fare dovrebbe essere fattibile in due modi.
    Nel primo, usi direttamente pyodbc.
    Nel secondo usi un framework tipo Qt.
    In entrambi i casi devi studiare un po', perché le cose non sono facilissime, soprattutto per gestire errori e consistenza dei dati.
    La documentazione di pyodbc la trovi qui.
    Quel frammento di codice che hai postato non fa altro che aprire una tabella Access e copiare i dati in un csv: tu devi aprire un XML e copiare i dati in Access. Quindi ti serve:
    • nome e path del file mdb
    • struttura delle tabelle contenute nell'mdb (che comunque puoi ricavare)
    • nome e path del file XML (o degli XML)
    • un algoritmo macinatutto che converta gli XML in una tupla che puoi passare a uno statement 'UPDATE'
    Gli XML si possono aprire usando le librerie standard di Python: ad esempio con xml.etree.ElementTree:
    >>> import xml.etree.ElementTree as ET
    data_string="""<Export version="0.10">
    <Remark LineCode="D71012148"/>
    <Remark BranchCode="D7102125008D7104212928"/>
    <Remark Type="R"/>
    <Remark Code="303"/>
    <Remark Quantity="1"/>
    <Remark Accessability="AA"/>
    <Remark Priority="1"/>
    <Remark Latitude="39,2005277490331"/>
    <Remark Longitude="8,4997620588403"/>
    <Remark Note=""/>
    <Remark idIMMAGINE="39.20052774903318.4997620588403303D7102125008.jpg"/>
    </Export>"""
    >>> root=ET.fromstring(data_string)
    >>> for child in root:
    	print(child.tag, child.attrib)
    
    	
    Remark {'LineCode': 'D71012148'}
    Remark {'BranchCode': 'D7102125008D7104212928'}
    Remark {'Type': 'R'}
    Remark {'Code': '303'}
    Remark {'Quantity': '1'}
    Remark {'Accessability': 'AA'}
    Remark {'Priority': '1'}
    Remark {'Latitude': '39,2005277490331'}
    Remark {'Longitude': '8,4997620588403'}
    Remark {'Note': ''}
    Remark {'idIMMAGINE': '39.20052774903318.4997620588403303D7102125008.jpg'}
    >>> 
    quindi avresti un dizionario per ogni tag, non il massimo ma potresti unire tutti i dizionari usando una qualche funzione merge fatta ad hoc.
Devi accedere o registrarti per scrivere nel forum
2 risposte