Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [vb6]File Da csv a recordset

    Salve a tutti
    ho una funzione che legge un file csv e crea un recordset.
    ho usato Microsoft.Jet.OLEDB.4.0 per importarmi i dati, non uso il file di ini.
    ho scoperto che i dati stringa del tipo '00002' li importa con il valore '2' piuttosto che
    esattamente con gli zeri davanti, qualcuno sa come posso risolvere il problema?
    Grazie!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma tu cosa hai scritto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: [vb6]File Da csv a recordset

    Originariamente inviato da Max Mercury
    Salve a tutti
    ho una funzione che legge un file csv e crea un recordset.
    ho usato Microsoft.Jet.OLEDB.4.0 per importarmi i dati, non uso il file di ini.
    ho scoperto che i dati stringa del tipo '00002' li importa con il valore '2' piuttosto che
    esattamente con gli zeri davanti, qualcuno sa come posso risolvere il problema?
    Grazie!
    Se tu non usi il file SCHEMA.INI, è normale che accada...

    Come ha detto Oregon: mostra il codice.

  4. #4
    codice:
    Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim strQuery As String
        Dim strHeader As String
        
        strHeader = IIf(bHeader, "YES", "NO")
        
        strQuery = "Select * from [" & ExtractName(strFilePath) & "]"
        
        cn.Open Sprintf("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;Extended Properties=""text;HDR=%2;FMT=Delimited(%3);MaxScanRows=0;ImportMixedType=Text;IMEX=0""", ExtractPath(strFilePath), strHeader, strSeparatore)
        rs.Open strQuery, cn, adOpenStatic, adLockReadOnly, adCmdText
    vi dico subito che quelli che vedete in extended properties sono i tentativi che sto facendo
    per vedere se importa in formato stringa, prima mi fermavo a delimited

  5. #5
    Non c'è verso... ho dovuto aggirare il problema da codice, in modo bruttissimo al momento del salvataggio dati.

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da Max Mercury
    codice:
    Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim strQuery As String
        Dim strHeader As String
        
        strHeader = IIf(bHeader, "YES", "NO")
        
        strQuery = "Select * from [" & ExtractName(strFilePath) & "]"
        
        cn.Open Sprintf("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%1;Extended Properties=""text;HDR=%2;FMT=Delimited(%3);MaxScanRows=0;ImportMixedType=Text;IMEX=0""", ExtractPath(strFilePath), strHeader, strSeparatore)
        rs.Open strQuery, cn, adOpenStatic, adLockReadOnly, adCmdText
    vi dico subito che quelli che vedete in extended properties sono i tentativi che sto facendo
    per vedere se importa in formato stringa, prima mi fermavo a delimited
    1) devi mostrarci la stringa di connessione in chiaro (quella che risulta da Sprintf() )
    se no non possiamo capire se è corretta o meno.

    2) devi mostrarci qualche riga del file CSV così da capire meglio la struttura, in quanto non sempre i CSV sono tutti uguali, ed i dati non sono sempre formattati allo stesso modo (es. le date).

    3) se tu usassi Command e Parametri sarebbe molto meglio.
    ADO, Parametri ed affini
    http://nuke.vbcorner.net/Articoli/VB...5/Default.aspx


  7. #7
    Ciao Gibra,
    la stringa di connessione che uso risulta:

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test\;Extended Properties=""text;HDR=NO;FMT=Delimited( ; )"""

    riga del file csv (gli asterischi li metto per la privacy ma non ci sono nel file)

    P.IVA VENDITORE; codice PdR;matricola ;CLIENTE;ragione sociale cliente finale;TIPOLOGIA - ARG/GAS 69/09;Aliquota;
    12*7**90159;00080000210936;61353429;**** **;*** ***;0;Aliquota al 10 % 10,00;


    il dato che mi da problemi è il secondo, dal quale leva gli 0 in testata

    Tieni presente che non so a priori di quante colonne sarà composto il file csv che devo
    importare e nemmeno la posizione, che può cambiare ogni volta.

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    OK, adesso possiamo ragionarci su.

    1° problema:
    Ti dico subito che non hai scampo: devi usare lo Schema.ini, perchè chi fa quel file fa tutto fuorchè renderlo standard.

    L'unico modo per non eliminare gli zeri è impostare il tipo del campo a Char, altrimenti vengono interpretati come campo numerico ed automatico elimina gli zeri all'inizio del valore.
    Per fare questo l'unico modo è appunto dichiarare il formato delle colonne nel file Schema.ini.
    Ad esempio:

    codice:
    [maxmercury.csv]
    ColNameHeader=False
    Format=Delimited(;)
    MaxScanRows=0
    CharacterSet=OEM
    Col1="col1" Char Width 255
    Col2="col2" Char Width 255
    Col3="col3" char Width 255
    Col4="col4" char Width 255
    Col5="col5" char Width 255
    Col6="col6" char Width 255
    Col7="col7" char Width 255
    Come vedi, ho impostato tutti i campi a Char 255 così non vi sono problemi di sorta.
    Inoltre, visto che non sai a priori quanti campi e l'ordine che avrai, dovrai crearti un file Schema.ini 'al volo' ogni volta, leggendo prima l'intestazione dei campi così da poter recuperarne il numero ed il nome.
    Qui c'è un'esempio di come fare
    http://support.microsoft.com/kb/155512/EN-US/
    ma dovrai modificartelo perchè mi sembra di aver capito che lui usa come riferimento una tabella del db. Attento che usa DAO!!!, cosa che sconsiglio, quindi adattatelo per ADO.

    Poi potresti fare altre migliorie come: impostare correttamente il tipo di campo a seconda del nome della colonna, la relativa lunghezza, ecc. ma tutto ciò dipende se 'chi' ti manda il file usa sempre una regola certa (cosa che invece mi par di capire non sia proprio così...).


    2° problema
    Come vedi, nello Schema.ini ho impostato ColNameHeader=False .
    In questo modo la prima riga del recordset ottenuto ti mostrerà i nomi dei campi così da poter riconoscere dal nome della colonna il tipo di dato altrimenti (visto che non conosci a priori l'ordine dei campi) come farai a distinguere, ad esempio, il Cliente dalla Ragione Sociale ?

    Morale della storia:
    Ho sostituito gli asterisci, giusto per avere valori 'leggibili', ed ho quindi fatto la prova su questi dati:
    codice:
    P.IVA VENDITORE; codice PdR;matricola ;CLIENTE;ragione sociale cliente finale;TIPOLOGIA - ARG/GAS 69/09;Aliquota;
    12070090159;00080000210936;61353429;Pippo Pluto;Ditta SPA;0;Aliquota al 10 % 10,00;
    Utilizzando questo codice:

    codice:
        Dim sSQL As String
        Dim sPath As String
        Dim sTable As String
        Dim sConnString As String
                
        sPath = App.Path & "\"
        sTable = "maxmercury.csv"
        
        sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
        sConnString = sConnString & sPath & ";Extended Properties='Text;HDR=NO;FMT=Delimited'"
        CN.ConnectionString = sConnString
        CN.CursorLocation = adUseClient
        CN.Open
        
        sSQL = ""
        sSQL = "SELECT * FROM [" & sTable & "]"
        
        rs.Open sSQL, CN, adOpenStatic, adLockReadOnly, adCmdText
        
        ' mostro i dati sul DataGrid
        Set DataGrid1.DataSource = rs
    ottenendo il risultato che vedi nell'immagine allegata.



    Immagini allegate Immagini allegate

  9. #9
    Grazie mille per il tempo e l'impegno, purtroppo la strada dell'ini è difficilmente percorribile
    questo perchè può capitare che il percorso dal quale scelgano il file non è accessibile
    dal programma, non ho i diritti per scrivere nella cartella o non la vedo proprio, non scendo nei particolari perchè è un problema sistemistico sul quale ho poche competenze.
    L'unica scappatoia la vedo copiandomi l'intero file nel folder della mia applicazione
    dove potrei creare il file ini adatto all'import, ma il file può essere di svariate centinaia di migliaia
    di righe, quindi di svariati mega, e come ti ho detto il client può accedere da una rete
    o in terminal server e questo renderebbe inutile il software, causa lentezza...

    In ogni caso ti ringrazio di nuovo per l'aiuto!

  10. #10
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Non conosco lo scenario, ma non credo che 'chi di dovere' non possa darti un accesso in lettura/scrittura ad una cartella dedicata allo scopo.

    D'altra parte, se vogliono un risultato 'come si deve' devono adeguarsi, altrimenti si tengono quello che arriva.
    Miracoli dicerto tu non ne puoi fare.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.