Access 2007 - VB6 Utilizzo di recordset per leggere file di testo delimitato da semicolon senza intestazioni

Anonimo
2016-05-12T09:14:42+00:00

Non riesco a leggere un file di testo delimitato da semicolon e senza intestazioni.

Il file di esempio (esempio.csv) è questo:

A1;A2;A3;A4;A5

B1;B2;B3;B4;B5

C1;C2;C3;C4;C5

D1;D2;D3;D4;D5

la connessione dati ADODB è questa :

ConnessioneFileDiTesto = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _

            & paPercorsoFile & ";Extended Properties=""text;HDR=NO;FMT=Delimited(;)"""

l'istruzione ADODB è :

    Dim Rs As New ADODB.Recordset

    Rs.Open "Select * from esempio.csv", ConnessioneFileDiTesto , adOpenDynamic, adLockOptimistic

l'istruzione viene eseguita ma il recordset ha 4 occorrenze con un solo campo (F1) contenente l'intera riga (es:A1;A2;A3;A4;A5) : il delimitatore (;) non viene considerato : risultato sbagliato.

Se modifico la connessione in HDR=YES  ho 3 occorrenze da 5 campi (A1 A2 A3 A4 A5) , ma nel file non ho intestazioni quindi risultato sbagliato.

Se il file esempio.csv contiene le "," in vece di ";" tutto funziona correttamente.

Sembra che il parametro FMT=Delimited(;) non viene considerato.

Grazie.

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
2016-05-13T14:13:42+00:00

Ciao Renato,

per far funzionare un separatore diverso dalla virgola hai due possibilità: modificare a mano il registro di configurazione di Windows (...) oppure creare un file chiamato Schema.ini presente nello stesso percorso del file Access. Questo esempio testato in ambiente Access 2007 funziona correttamente:


Sub sTest()

    Dim objConnection As Object

    Dim objRecordset As Object

    Dim strPathtoTextFile  As String

    Const adOpenStatic = 3

    Const adLockOptimistic = 3

    Const adCmdText = &H1

    Set objConnection = CreateObject("ADODB.Connection")

    Set objRecordset = CreateObject("ADODB.Recordset")

    strPathtoTextFile = CurrentProject.Path & ""

    objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _

              "Data Source=" & strPathtoTextFile & ";" & _

              "Extended Properties=""text;HDR=No;FMT=Delimited"""

    objRecordset.Open "SELECT * FROM test.csv" _

        , objConnection _

        , adOpenStatic _

        , adLockOptimistic _

        , adCmdText

    Do Until objRecordset.EOF

        Debug.Print objRecordset.Fields(0).Value

        objRecordset.MoveNext

    Loop

    objRecordset.Close

    objConnection.Close

    Set objRecordset = Nothing

    Set objConnection = Nothing

End Sub


Mentre per il file Schema.ini crei un file di testo e ci scrivi dentro


[test.CSV]

ColNameHeader=False

CharacterSet=ANSI

Format=Delimited(;)


David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

7 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-05-14T08:07:52+00:00

    Ciao Renato

    puoi approfondire l'utilizzo del dile schema.ini partendo ad esempio da questi due link:

    Schema.ini File (Text File Driver)

    ACC: How to Use Schema.ini for Accessing Text Data

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-05-13T15:30:19+00:00

    Ciao Renato,

    per far funzionare un separatore diverso dalla virgola hai due possibilità: modificare a mano il registro di configurazione di Windows (...) oppure creare un file chiamato Schema.ini presente nello stesso percorso del file Access. Questo esempio testato in ambiente Access 2007 funziona correttamente:


    Sub sTest()

        Dim objConnection As Object

        Dim objRecordset As Object

        Dim strPathtoTextFile  As String

        Const adOpenStatic = 3

        Const adLockOptimistic = 3

        Const adCmdText = &H1

        Set objConnection = CreateObject("ADODB.Connection")

        Set objRecordset = CreateObject("ADODB.Recordset")

        strPathtoTextFile = CurrentProject.Path & ""

        objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _

                  "Data Source=" & strPathtoTextFile & ";" & _

                  "Extended Properties=""text;HDR=No;FMT=Delimited"""

        objRecordset.Open "SELECT * FROM test.csv" _

            , objConnection _

            , adOpenStatic _

            , adLockOptimistic _

            , adCmdText

        Do Until objRecordset.EOF

            Debug.Print objRecordset.Fields(0).Value

            objRecordset.MoveNext

        Loop

        objRecordset.Close

        objConnection.Close

        Set objRecordset = Nothing

        Set objConnection = Nothing

    End Sub


    Mentre per il file Schema.ini crei un file di testo e ci scrivi dentro


    [test.CSV]

    ColNameHeader=False

    CharacterSet=ANSI

    Format=Delimited(;)


    David

    Grazie David,

    la soluzione proposta mi funziona correttamente.

    Questo significa che la costruzione della Stringa di connessione non viene utilizzata : lo dico con dispiacere ma lo accetto.

    Esistono parametri di default per lo Schema.ini ? con un set di parametri potrei gestire una certa tipologia di files .... 

    In alternativa dovrò gestire il file Schema.ini per ogni nuovo singolo file che andrò ad utilizzare. 

    Grazie di nuovo David.

    Renato

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-05-13T12:41:58+00:00

    Grazie Sandro,

    se lo collego via wizard non ci sono problemi.

    Ma non è la soluzione al mio problema.

    Ho la necessità di interrogare un file di testo ( ma un domani saranno n)  utilizzando un recordset ADODB.

    E' una feature di Access ben descritta ma non funziona, anzi, non ha mai funzionato sin da access 97, 2000, 2003, 2007.

    Per la prima volta mi affaccio ad un forum a sollevare il problema visto che, dopo estenuanti ricerche sul web, nessuno ne parla o chi ne parla fa esempi con la virgola e da per scontato che basta definire il delimitatore e tutto funziona.

    Hai mai provato a far funzionare un esempio simile al mio ?

    Di nuovo tante grazie Sandro.

    Renato

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-05-12T09:41:34+00:00

    ciao Renato,

    hai provato a collegare il file csv? visto  le caratteristiche credo che lo si possa collegare tranquillamente, anche via wizard.

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento