Condividi tramite

Importazione da file txt con più tabelle

Anonimo
2013-06-18T17:54:15+00:00

Salve a tutti,

ho un file txt con all'interno i valori di più tabelle; praticamente ho una riga di intestazione e di seguito varie righe per ogni record, poi quando si passa alla seconda tabella ho un altra riga di intestazione e di seguito i vari record...

Come posso fare per importare questi record in più tabelle di access, utilizzando VBA..? Quello che vorrei capire è come fare da codice a separare le varie tabelle contenute nel file di testo..

Grazie

Matteo

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2013-06-19T19:32:39+00:00

Ciao Matteo,

non conosco il contenuto del tuo file quindi verificheremo insieme quello che ti scrivo.

Immaginiamo che le 4 tabelle esistano e che tu le voglia ricoprire con una nuova importazione:

Option Compare Database

Option Explicit

Function ImportaFile()

Dim Db As Database

Dim Rs1 As Recordset

Dim Rs2 As Recordset

Dim wId As String

Dim ind As Integer

Dim wStart As Integer

Dim wPos As Integer

Set Db = CurrentDb

' Valuta tu se eliminare il contenuto preesistente delle tabelle

DoCmd.SetWarnings False

DoCmd.RunSQL ("Delete * From Tbl11")

DoCmd.RunSQL ("Delete * From Tbl21")

DoCmd.RunSQL ("Delete * From Tbl31")

DoCmd.RunSQL ("Delete * From Tbl41")

DoCmd.SetWarnings True

Set Rs1 = Db.OpenRecordset("Select * From tblInput")         ' File in Input

Rs1.MoveFirst

Do While Not Rs1.EOF

wId = Left(Rs1("Campo1"), 2)

If wId = "11" Or _

wId = "21" Or _

wId = "31" Or _

wId = "41" Then

Rs1.MoveNext                                        ' primo record da importare

Do While wId = Left(Rs1("Campo1"), 2)

Set Rs2 = Db.OpenRecordset("Select * From Tbl" & wId)          ' Tabella output

Rs2.AddNew

wStart = 1

wPos = InStr(wStart, Rs1("Campo1"), ";")

ind = 0

Do While wPos > 0

Rs2(ind) = Mid(wStart, wPos - 1)

wStart = wPos + 1

wPos = InStr(wStart, Rs1("Campo1"), ";")

ind = ind + 1

Loop

Rs2(ind) = Mid(wStart, Len(Rs1("Campo1")) - 1)

Rs2.Update

Rs1.MoveNext

Loop

End If

Rs1.MoveNext

Loop

End Function

Ovviamente non ho avuto modo per provarlo ma solo compilarlo :-)

Dò per scontato che i caratteri che identificano il file (11 21  31  41 ) siano ripetuti su tutti i record di ciascun file.

Ciao a domani

Mimmo

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2013-06-19T10:18:41+00:00

Ciao Matteo,

una possibile soluzione puoi provare a ricavarla dal successivo esempio.

L'esempio si basa sul presupposto di importare in una tabella Access il file txt senza suddividere il record in campi. L'intero record si chiama Campo1. Il file si compone di tre tipi record 11, 21 e 31.

Function NormalizzaApiba()

     Dim Db As Database

     Dim Rs1 As Recordset

     Dim Rs2 As Recordset

     Dim Sw As Integer

     Dim wAbi As String

     Dim WAbiCin As String

     Dim wCabCin As String

     Dim wBanca As String

     Dim wAbiRif As String

     Dim wCodRif As String

     Dim wFBA As String

     Dim wAbiCapo As String

     Dim wBAbiCapoCin As String

     Dim wBAbi As String

     Dim CapoCin As String

    Set Db = CurrentDb

    Set Rs1 = Db.OpenRecordset("Select * From Pippo")         ' File in Input

    Set Rs2 = Db.OpenRecordset("Select * From Apiba_Norm")   ' Tabella generata

    Rs1.MoveFirst

    Do While Not Rs1.EOF

       If Left(Rs1("Campo1"), 2) = 11 Then                    ' Tipo record 11

          Sw = 0

          Rs2.AddNew

          wAbi = Mid(Rs1("Campo1"), 3, 5)

          WAbiCin = Mid(Rs1("Campo1"), 13, 1)

          wBanca = Mid(Rs1("Campo1"), 14, 80)

          wFBA = Mid(Rs1("Campo1"), 94, 1)

          wAbiCapo = Mid(Rs1("Campo1"), 95, 5)

          wBAbiCapoCin = Mid(Rs1("Campo1"), 100, 1)

          Rs2("Abi") = wAbi

          Rs2("AbiCin") = WAbiCin

          Rs2("Banca") = wBanca

          Rs2("FBA") = wFBA

          Rs2("AbiCapo") = wAbiCapo

          Rs2("AbiCapoCin") = wBAbiCapoCin

       End If

       If Sw = 1 Then

          Rs2.AddNew

          Rs2("Abi") = wAbi

          Rs2("AbiCin") = WAbiCin

          Rs2("Banca") = wBanca

          Rs2("FBA") = wFBA

          Rs2("AbiCapo") = wAbiCapo

          Rs2("AbiCapoCin") = wBAbiCapoCin

       End If

       If Left(Rs1("Campo1"), 2) = 21 Then                       ' Tipo record 21

          Rs2("Cab") = Mid(Rs1("Campo1"), 8, 5)

          Rs2("CabCin") = Mid(Rs1("Campo1"), 13, 1)

          Rs2("FCA") = Mid(Rs1("Campo1"), 20, 1)

          Rs2("Indir") = Mid(Rs1("Campo1"), 21, 80)

          Rs2("Citta") = Mid(Rs1("Campo1"), 101, 40)

          Rs2("Comune") = Mid(Rs1("Campo1"), 141, 40)

          Rs2("Cap") = Mid(Rs1("Campo1"), 181, 5)

          Rs2("Prov") = Mid(Rs1("Campo1"), 186, 2)

          Sw = 0

       End If

       If Left(Rs1("Campo1"), 2) = 31 Then                       ' Tipo record 31

          Rs2("Agenzia") = Mid(Rs1("Campo1"), 13, 40)

          Rs2.Update

          Sw = 1

       End If

       Rs1.MoveNext

       Loop

    Rs1.Close

    Rs2.Close

    Set Rs1 = Nothing

    Set Rs2 = Nothing

    Set Db = Nothing

End Function

Se trovi difficoltà e ci dai altri input riguardo il tuo file possiamo approfondirne lo studio.

Ciao Mimmo

La risposta è stata utile?

0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-06-19T08:41:06+00:00

    Matteo,

    considerando il fatto che le tabelle hanno diversa struttura, quante sono le tabelle che ti aspetti di dover trattare ? Considera che per ciascuna dovrai gestire la scomposizione in campi. Quanti sono i campi di ciascuna tabella che ti aspetti di dover trattare?

    Dovrai gestire una sequenza di :

    campox = mid(recin;byteinizio;lung)

    per impostare ogni campo della tabella.

    Appena trovo tempo ti posto un esempio più completo.

    Ciao Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-06-19T07:56:45+00:00

    Ciao Mimmo,

    purtroppo le tabelle non hanno tutte la stessa struttura...

    per quanto riguarda il nome della tabella, guardando i record posso intuire che la prima colonna di ogni tabella contiene il tipo record, che è un valore: nella prima tabella è 0, nella seconda è 10, nella terza è 20 e così via.....

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-06-19T07:48:35+00:00

    Ciao Matteo,

    il nome della tabella è ricavabile dalla riga di intestazione o ad esempio è un progressivo ?

    le tabelle da importare hanno tutte stessa struttura ?

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento