Newsgroup: it.comp.appl.access
Titolo: Importazione file di testo in tabella

Ciao a tutti.
Sto procedendo con la mia applicazione che deve interfacciare e collegare un 
server esterno con una interfaccia access attraverso i File di Testo (ordini 
dall'alto!)
Ho visto su MSAccess l'importazione del file di testo con la procedura 
manuale (definizione dei campi, lunghezza ecc.) che vorrei rendere 
automatica da codice.
Ho la possibilità di scaricare il file di testo da importare (questa 
operazione avverrà obbligatoriamente in modo 'manuale', ovvero scaricando il 
file da sitop FTP sul desktop del PC che ospita la mia applicazione) da un 
server. Questo file ha sempre la stessa identica struttura ma è composto da 
record (righe) che non sono tutti uguali.
Ad esempio:
FILEDAIMPORTARE.TXT
Riga 1: CodiceUtente, testo 10 - Cognome, testo 20 - Nome, testo 20, 
DataDiNascita, testo 20
Riga 2: CodiceProdotto, testo 5 - Descrizione, testo 5 - Costo unitario, 
testo 10 - Classe, testo 1
Riga 3 IDEM
Riga 4 IDEM
...
Riga n IDEM
Riga n+1 : TotaleA, testo 10 - Totale B, testo 10 - Operatore, testo 15
Sono riuscito, con l'aiuto di Karl, Sergio e molti altri, mesi fa a creare 
la procedura di 'Esportazione' della tabella in un file di testo
attraverso la definizione di un Array e la lettura dei singoli caratteri 
(Ecco il codice) che funziona alla grande:
[CODE]
        Dim aDimCampi90(0 To 6) As Byte
        aDimCampi90(0) = 3
        aDimCampi90(1) = 2
        aDimCampi90(2) = 6
        aDimCampi90(3) = 6
        aDimCampi90(4) = 6
        aDimCampi90(5) = 6
        aDimCampi90(6) = 21
        Set rsTipo90 = CurrentDb.OpenRecordset("Tabella_Record90")
        rsTipo90.MoveFirst
        Do Until rsTipo90.EOF
            For X = 0 To rsTipo90.Fields.Count - 1
              Print #1, Left$(Nz(rsTipo90.Fields(X), "") & 
String$(aDimCampi90(X), Chr$(32)), aDimCampi90(X));
            Next
            rsTipo90.MoveNext
            Print #1, ""
        Loop
        Set rsTipo90 = Nothing
[/CODE]
Chi mi da una dritta per l'importazione?
Grazie a chi vorrà darmi dei suggerimenti.
vuLCan 

 ha scritto nel messaggio 
news:467fa143$0$21201$5fc...@news.tiscali.it...

Se l'importazione ha la stessa struttura dell'esportazione devi cambiare la 
modalità della Open da OutPut a Input e la Print in Input (vedi help).
La Input leggerà una riga (Input #1, riga) e poi tu tramite l'array che 
contiene le posizioni dei campi spezzi la stringa con la Mid.
Ovviamente le operazioni sul recordset saranno in AddNew e concluse con 
Update...
Ciao.
-- 
Sergio MAZZA 

 Update...
Ciao Sergio.
Se ti dico che non ho capito una MAZZA ti offendi?!?!?!?!?! 
:)))))))))))))))))))
Mi hai aiutato in passato per la gestionen di un database ASP ricordi?!?!
Sono sempre io! :)
Grazie per la tua risposta.
Stavo cercando qualcosa nel TranserText e ho trovato infomazioni su 
schema.ini
Credo che sia un buon punto di inizio.
Cosa ne pensi se
1) Leggo la prima riga e applico Schema1.ini
2) Importo in una Tabella_A
3) Leggo la seconda riga fino alla riga n e applico Schema2.ini
4) Importo in una Tabella_B
5) Leggo l'ultima riga e applico Schema3.ini
6) Importo in Tabella_C
Considerato anche che ogni 'riga' del file di testo è identificata da un 
valore 'TIPO RIGA' (che identifica il contenuto
della riga stessa) come posso fare in modo che il mio puntatore "legga" quel 
valore?
Ovvero: come posso, leggendo un file per l'importanzione "capire" che si 
tratta di un nuovo record?
Dal CR+LF?
Sigh... sono in altissimo mare....

Ho trovato qui
http://forum.masterdrive.it/office-and-vba-23/access-vba-importazione-file-txt-17973/
il codice per la soluzione di un problema simile al mio.
Ecco qui il codice del bravissimo Alessandro:
Dim rs              As DAO.Recordset
Dim TextLine    as String
Dim 2Char        as String
Dim CodeChar  as String
Dim TimeChar   as String
Set rs=CurrentDb.OpenRecordset("NomeTabella",dbOpenDynaset)
Open "file.txt" For Input As #1   ' Apre il file.
Do While Not EOF(1)
    Line Input #1, TextLine
    2Char=Mid$(TextLine,1,2)
    If 2Char="02" Then
         CodeChar  ="Mid$(TextLine,3,Len(TextLine))
         ' Quì hai il Nome Utente poi fai quello che vuoi
    ElseIf 2Char="04" then
         TimeChar ="Mid$(TextLine,3,Len(TextLine))
         ' Quì hai l'orario e ci fai sempre quello che vuoi se devi inserire 
un Record lo fai quì
         rs.AddNew
         ......
    End if
Loop
rs.Close
Set rs=nothing 

 Sigh... sono in altissimo mare....
ALT!
Il file di testo che struttura ha?
Mi fai un esempio?
Ho capito, dal tuo primo messaggio, che i record non hanno strutture simili 
ma che c'entra il CR+LF?
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Ecco un file di esempio (Sotto la descrizione dei tracciati record):
1 Pinco Pallino         Roma           00100   001
2 1200 900 6700 001
2 1900 100 5000 001
2 2130 400 3200 001
2 4000 300 4300 001
3 Pinco Pallino Shop                    10/05/2007 001
1 Tizio Caio             Nuoro          08100  002
2 9000 400 3200 002
2 1000 322 4300 002
3 Tizio Caio Shop                        01/12/2005 002
Vediamo se riesco a far capire meglio:
Il numero ad inizio record indica il TIPO RIGA
Sulla base del TIPO RIGA posso individuare il tracciato record:
TIPO RECORD 1
Da 1 a 2 Tipo record
Da da 2 a 30 Nome e cognome
Da 31 a 40 Città
Da 41 a 46 CAP
Da 47 a 49 ID di identificazione
TIPO RECORD 2
Da 1 a 2 Tipo record
Da 3 a 6 Valore1
Da 7 a 9 Valore2
Da 10 a 13 Valore3
Da 14 a 16 ID di identificazione
TIPO RECORD 3
Da 1 a 2 Tipo record
Da 2 a 30 Nome Shop
Da 31 a 40 Data Chiusura
Da 41 a 43 ID di identificazione
Ecco le caratteristiche del file:
1) La sequenza è obbligatoriamente quella descritta (1 poi 2 poi 3) ma:
  a) E' possibile avere solo 1 record di tipo 1
  b) E' possibile avere n record di tipo 2
  c) E' possibile avere solo 1 record di tipo 3
2) Il file è composto da n blocchi di record di tipo 1,2 e 3
Ecco le mie domande:
Come posso 'leggere' questo file e memorizzare i dati in tabelle sulla base 
del TIPO RIGA?
Grazie al campo "ID di identificazione" in coda potrei poi facilmente 
'ricostruire' la struttura del blocco di record ma come
importare tutto in Access?
Senti quale strada logica sto seguendo: dovrei 'leggere' il TIPO RIGA 
(sempre nella stessa posizione) e sulla base di questo
applicare uno "schema.ini" differente.
Ma ho seri problemi a:
1) Capire come posso impostare il codice per 'leggere' da un byte all'altro 
e memorizzare in un campo di una tabella
2) Applicare un'importazione di dati specifica sulla base di questo valore.
Grazie per la tua solita gentilezza.
vuLCan 

 ma che c'entra il CR+LF?
Beh, sbaglio o l'a capo è un carattere CR+LF?
Ogni fine riga di un file di testo non ha un CR+FL in coda?
Dico cretinerie? 

 Dico cretinerie?
No, ma dal discorso sembrava che il CR+LF fosse il separatore dei dati...
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio 
news:4680eb59$0$21203$5fc...@news.tiscali.it...

Questo è un esempio di lettura della riga e scomposizione delle 
informazioni:
'---
On Error GoTo errori
Const ForReading = 1, ForWriting = 2
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.openTextFile(CurrentProject.path & "\vulcan.txt ", ForReading)
Dim strRec As String
Do While f.AtEndOfStream <> True
    strRec = f.ReadLine
    Debug.Print strRec
    Debug.Print "--------------------------"
    Select Case Val(Left(strRec, 2))
        Case 1
            Debug.Print Mid(strRec, 1, 1)
            Debug.Print Mid(strRec, 3, 22)
            Debug.Print Mid(strRec, 25, 15)
            Debug.Print Mid(strRec, 40, 5)
            Debug.Print Right(strRec, 3)
        Case 2
            Debug.Print Mid(strRec, 1, 1)
            Debug.Print Mid(strRec, 3, 5)
            Debug.Print Mid(strRec, 8, 3)
            Debug.Print Mid(strRec, 12, 4)
            Debug.Print Right(strRec, 3)
        Case 3
            Debug.Print Mid(strRec, 1, 1)
            Debug.Print Mid(strRec, 3, 38)
            Debug.Print Mid(strRec, 41, 10)
            Debug.Print Right(strRec, 3)
    End Select
    Debug.Print "--------------------------"
Loop
f.Close
Set f = Nothing
Set fso = Nothing
Exit Sub
errori:
    Set f = Nothing
    Set fso = Nothing
    MsgBox Err.Number & " " & Application.AccessError(Err.Number)
'---
Devi solo calibrare i parametri della funzione Mid:
Mid(stringa,inizioCarattere,numeriCaratteriDaLeggere)
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio 
news:f5r3ml$b98$1...@tdi.cu.mi.it...

Gran bel pezzo di codice!!! :))
L'ho letto attentamente.
Sbaglio o fai visualizzare nell'immediata il risultato della lettura?
Posso associare il valore restituito dalla funzione Debug.Print Mid(strRec, 
1, 1)
ad una variabile e scriverla in una tabella?
Readline si ferma al CR LF?
Grazie infinite. 

 Grazie infinite.
Di nulla...
Ciao.
-- 
Sergio MAZZA