+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Importazione file .csv in tabella Access

  1. #1
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276

    Importazione file .csv in tabella Access

    Buonasera a tutti,
    con una semplice query (trovata su internet) riesco ad importare tutti i dati di un file csv dentro una tabella access.
    Allora qual'è il problema ?
    Strano, almeno per me, è il fatto che funzioni perfettamente e velocemente con Access 2010 mentre solleva errore con Access 2003.

    codice:
    Dim cmd  As ADODB.Command
    
        
          Set cmd = New ADODB.Command
        
    
    sSQL = "INSERT INTO [CSVIrraggiamento] " _
                        & "SELECT * FROM [TEXT;HDR=YES;DATABASE=F:\ProvaIrraggiamento\].treatments.csv"
     With cmd
                 .ActiveConnection = cn
                 .CommandType = adCmdText
                 .CommandText = sSQL
                  cmd.Execute
     End With
     
     
     MsgBox "fatto!", vbInformation, Me.Caption
    L' errore sollevato è " L'istruzione INSERT INTO contiene il seguente campo sconosciuto......" elencando tutti i campi non divisi dalla virgola.
    L'errore, credo sia dovuto al fatto che considera tutti i campi come un solo campo e quindi non riesce a trovare il corrispettivo nella tabella, ma perchè con Access 2010 tutto funziona e con Access 2003 no ?

  2. #2
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,087

  3. #3
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Se lo dici tu allora, certamente è così e mi posso rassegnare.
    Grazie

  4. #4
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Non mi sono rassegnato. D'altronde da questo forum oltre ad avere tanti suggerimenti e aiuti concreti, ho imparato a non arrendermi facilmente.
    ho impostato il seguente codice che in sostanza apre il recordset, il file .csv e dovrebbe aggiungere tutti i record con i valori della riga separati da virgola.
    codice:
    Dim str1 As String
    Set rs = New ADODB.Recordset
     sSQL = "SELECT * FROM  Cirraggiamento"
      rs.Open sSQL, cn, adOpenKeyset, adLockOptimistic
    
    Open App.path & "\treatments.csv" For Input As #1
       
     
       i = 0
       Do While Not EOF(1)
          Line Input #1, str1
           
           a = Split(str1, ",")(1)
           b = Split(str1, ",")(2)
          
          
          
           If i > 0 Then
             rs.AddNew
               rs(0) = a
               rs(1) = b
             rs.Update
           End If
     
      i = i + 1
       Loop
       Close #1
       rs.Close: Set rs = Nothing
    purtroppo non riesco a caricare i valori di a e b nel recordset in quanto solleva il seguente errore.

    Si sono verificati errori in un'operazione composta da più passaggi.
    Controllare i singoli valori di stato.
    Potete darmi un aiuto?

  5. #5
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,087
    Senza sapere nulla dei dati che stai manipolando è difficile darti un aiuto.

    Quell'errore è in genere causato dai dati che non sono riconosciuti dal database.
    Senza vedere i dati è praticamente impossibile dare un qualsivoglia suggerimento.

    Io utilizzarei lo SCHEMA.INI ed aprirei la 'tabella' CSV.
    Una volta configurato questo file, il lavoro si semplifica non poco.

    Hai presente come funziona lo SCHEMA.INI ?

    Schema.ini File (Text File Driver) | Microsoft Docs
    https://docs.microsoft.com/en-us/sql...ql-server-2017
    Ultima modifica di gibra; 29-05-2018 17:12 

  6. #6
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Non ho mai usato lo schema.ini, guardando in rete ho reperito il seguente codice che ho adattato.
    il file.csv è composto da 14 campi separati da virgola ( sono partito dalla col0(zero). Sono quasi tutti formato testo ad eccezione di due. Uno data e l'altro ora.
    codice:
    Dim intFile As Integer
       Dim cmd  As ADODB.Command
    
        
          Set cmd = New ADODB.Command
          
          
          
        intFile = FreeFile(0)
        Open App.path & "\Schema.ini" For Output As #intFile
        Print #intFile, "[" & treatments & "]"
        Print #intFile, "MaxScanRows=1"
        Print #intFile, "Format=CSVDelimited"
        Print #intFile, "ColNameHeader=False"
        Print #intFile, "DateTimeFormat=dd/mm/yyyy"
        Print #intFile, "col0=Fill0 Text"
        Print #intFile, "col1=Fill1 Text"
        Print #intFile, "Col2=""Date"" DateTime"
        Print #intFile, "Col3=""Time"" DateTime"
        Print #intFile, "Col4=Fill4 Text"
        Print #intFile, "Col5=Fill5 Text"
        Print #intFile, "Col6=Fill6 Text"
        Print #intFile, "Col7=Fill7 Text"
        Print #intFile, "Col8=Fill8 Text"
        Print #intFile, "Col9=Fill9 Text"
        Print #intFile, "Col10=Fill10 Text"
        Print #intFile, "Col11=Fill11 Text"
        Print #intFile, "Col12=Fill12 Text"
        Print #intFile, "Col13=Fill13 Text"
        Print #intFile, "Col14=Fill14 Text"
        Close #intFile
        
        sSQL = "INSERT INTO [CIrraggiamento] ([identificationNumber], [bagCode], [treatDate], "
                   sSQL = sSQL & " [treatTime],[operatorCode],[monoblockPosition],[setTime],[xrayTime],[stopTime], "
                   sSQL = sSQL & " [kv],[ma],[dose],[basket],[treatmentCompleted],[boxTemperature])"
                   sSQL = sSQL & " SELECT [identificationNumber], [bagCode], [treatDate],[treatTime],[operatorCode], "
                   sSQL = sSQL & " [monoblockPosition], [setTime],[xrayTime],[stopTime], [kv],[ma],[dose],[basket], "
                   sSQL = sSQL & " [treatmentCompleted],[boxTemperature]"
                   sSQL = sSQL & " FROM [TEXT;HDR=YES;DATABASE=F:\ProvaIrraggiamento\].treatments.csv"
                  
         With cmd
                 .ActiveConnection = cn
                 .CommandType = adCmdText
                 .CommandText = sSQL
                  cmd.Execute
     End With
     
     
        Kill App.path & "\schema.ini"
    purtroppo solleva l' errore "Nessun valore specificato per alcuni parametri necessari"
    Ho controllato tutti i campi e sono giusti.
    la mia limitata conoscenza mi impedisce di capire dov'è l'inghippo.
    Grazie per la tua preziosa collaborazione

  7. #7
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,087
    Senza vedere il file CSV è difficile capire, perché conoscere il contenuto è fondamentale per sapere come muoversi.

    Però alcune cose risultano subito all'occhio. Esempio, mi sembra strano che:
    1 - non vi siano le intestazioni nel file (ColNameHeader=False)
    2 - non vedo l'impostazione per i decimali (DecimalSymbol)
    3 - nessuno dei campi definiti in ColX esistono nella query di INSERT

    Onestamente, troverei strano se funzionasse.

    Ripeto: senza conoscere la struttura della tabella ed il file CSV non è per nulla semplice.

    La settimana scorsa ho realizzato un'importazione CSV da Excel usando la stessa tecnica.
    Nello specifico, l'importazione dei dati doveva essere progressiva, ovvero inizialmente doveva importare tutto, poi man mano che si aggiornava il file CSV (che era sempre lo stesso) si dovevano importare solo le righe nuove, aggiunte partendo dall'ultima data presente.

    All'inizo mi dava errore, ci ho perso un bel po' di tempo per poi scoprire che le colonne (sia in Excel che nel CSV) avevano nomi chiave riservati (come: Date, Time, Open, ...), poi ho dovuto anche scontrarmi con i 'soliti' problemi di formattazione di Excel (maledetto).
    Il risultato finale è stato davvero soddisfacente, perché qualsiasi altra soluzione in Excel 'puro' impiegava una sacco di tempo (in alcuni casi Excel si 'impallava') mentre con questa tecnica quasi nemmeno il tempo di premere il pulsante!
    E sto parlando di file con 16.000 righe.


  8. #8
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    Il file .csv proviene da un analizzatore i cui dati registrati vengono scaricati in formato CSV.
    Per poter realizzare un registro ho pensato, tramite VB6.0, di importere i dati data per data dentro una tabella
    Access e quindi verificarli e stamparli.
    Sinora ho effettuato la cosa passando i dati prima in Excel ( tempi lunghissimi) e poi da excel nella tabella.
    Questo file CSV scarica ogni volta TUTTI i dati per cui da excel accodavo solo da date a data.
    In pratica quasi quello che hai fatto tu.
    Con Access 10 l'import è immediato, purtroppo nel laboratorio hanno versioni precedenti ecco perchè mi sono trovato nei guai.

    la struttura della tabella è :
    0 identificationNumber numerico
    1 bagCode testo
    2 treatDate Data/Ora dd/mm/yyyy
    3 treatTime Data/Ora hh:mm
    4 operatorCode testo
    5 monoblockPosition testo
    6 setTime numerico
    7 xrayTime numerico
    8 stopTime nuemrico
    9 kv numerico
    10 ma numerico
    11 dose numerico
    12 basket testo
    13 treatmentsCompleted testo
    14 boxTemperature numerico

    nel file SCHEMA.INI ho messo, credendo di fare meglio, tutti i campi, escluso Date e Time, formato testo
    e impostato a false ColNameHeader credendo di non dover imporare le intestazioni.

    il file CSV lo trovi a questo indirizzo

    Rapidshare - Premium file sharing services with self-destruction & auto encryption

    sicuramente ho definito male i campi colX

  9. #9
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    6,087
    Ho scaricato il file, queste sono le prime tre righe:
    codice:
    500,,2018-01-02,11:38:52,piero,up,343,343,0,180,20,0.0,True,True,24
    501,I200917043204,2018-01-02,12:49:52,piero,up,343,343,0,180,20,0.0,True,True,26
    501,I200917043036,2018-01-02,12:49:52,piero,up,343,343,0,180,20,0.0,True,True,26
    In effetti, stranamente, mancano i nomi dei campi.
    Comunque:
    1 - le ColXX le devi definire correttamente, devono corrispondere ai nomi dei campi della tabella.
    2 - Il DateTimeFormat non deve essere definito, perché altrimenti viene considerato per tutti i campi di tipo DateTime, e questo ti crea poi il problema con i soli campi Time, perché nel campo ti metterebbe la data completa: [Data di default del database] + ora, invece della sola ora.


    Giusto per farti capire, il file CSV dell'importazione di cui ti parlavo ha questi valori:
    codice:
    DateX, TimeX, OpenX, HighX, LowX, LastX, VolumeX, NumberOfTradesX, BidVolumeX, AskVolumeX
    2015/6/4, 08:00:00, 11404.5, 11423.5, 11377.0, 11423.5, 15, 13, 8, 7
    Lo schema.ini l'ho impostato così:

    codice:
    [Old_BarData_1Hour.txt]
    ColNameHeader=True
    Format=CSVDelimited
    CharacterSet=ANSI
    DecimalSymbol=.
    ;DateTimeFormat=yyyy/mm/dd
    Col1=DateX DateTime(yyyy/mm/dd)
    Col2=TimeX DateTime
    Col3=OpenX Float
    Col4=HighX Float
    Col5=LowX Float
    Col6=LastX Float
    Col7=VolumeX Long
    Col8=NumberOfTradesX Long
    Col9=BidVolumeX Long
    col10=AskVolumeX Long
    Applica le modifiche che ti ho suggerito e vedi se sono sufficienti.
    Nel caso ripubblica il nuovo SCHEMA.INI e vediamo.


    Se fai un progettino di prova (basta anche la sola tabella CIrraggiamento) provo darci un'occhiata.
    Ultima modifica di gibra; 30-05-2018 15:19 

  10. #10
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    276
    ho provato come mi hai suggerito, ma continua a darmi lo stesso errore.
    Il file treatments.csv che ti ho inviato in effetti era senza intestazioni. lo avrò manomesso senza accorgermi.
    Ti invio un progetto. Spero tanto possa aiutarmi.
    Grazie

    Rapidshare - Premium file sharing services with self-destruction & auto encryption

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi