• User

    [ASP] Importazione di file CSV in DB Access

    Ciao a tutti.

    Mi sono appena registrato a questo forum e spero ricevere molte risposte ai miei numerosi dubbi su ASP.

    Questo è il problema di oggi 🙂 :

    Riesco tramite ASP a leggere queste stringhe da un file CSV ed a inserirle in una tabella access:

    29/06/2008 00:15:48
    29/06/2008 00:34:54
    29/06/2008 07:28:03
    29/06/2008 07:38:03
    29/06/2008 08:52:33
    29/06/2008 12:43:14
    29/06/2008 13:18:58
    29/06/2008 14:26:04
    29/06/2008 15:28:05
    29/06/2008 15:39:13
    29/06/2008 15:42:54
    29/06/2008 16:09:16
    29/06/2008 17:18:46
    29/06/2008 19:27:23
    29/06/2008 21:27:23
    

    E' possibile saltare l'importazione di alcune di queste righe?

    Per esempio la seconda riga ha una data/orario che si differenzia dalla prima di soli 20 minuti circa e quindi andrebbe esclusa... la quarta riga ha una data/orario che si differenzia dalla quarta di soli 10 minuti e quindi andrebbe esclusa... etc, etc...

    Il criterio dovrebbe essere che tra le righe susseguenti per essere importate in access la differenza deve sempre essere superiore a 30 minuti.

    E' possibile?
    Saluti


  • User Attivo

    Certo che è possibile, penso che tu abbia implementato un ciclo che legge riga per riga finquando non finisce il file ed inserisce i dati nel db, puoi sempre fare un controllo tra l'ora del precedente record e quella del record successivo se la differenza in minuti è maggiore di 30 allora inserisci nel db.

    uno pseudo codice:

    
    precedentedataora = "01/01/1900 00:00:00"
    while (il file non è stato letto tutto)
      dataoraattuale = leggilineadelfile  
      if datediff("n",precedentedataora ,dataoraattuale) >= 30 then
        inserisci il tutto nel db
        precedentedataora = dataoraattuale 
      end if
    wend
    
    

    se hai dei dubbi sul codice posta pure


  • User

    @tonyx said:

    Certo che è possibile, penso che tu abbia implementato un ciclo che legge riga per riga finquando non finisce il file ed inserisce i dati nel db, puoi sempre fare un controllo tra l'ora del precedente record e quella del record successivo se la differenza in minuti è maggiore di 30 allora inserisci nel db.

    uno pseudo codice:

    >
    precedentedataora = "01/01/1900 00:00:00"
    while (il file non è stato letto tutto)
      dataoraattuale = leggilineadelfile  
      if datediff("n",precedentedataora ,dataoraattuale) >= 30 then
        inserisci il tutto nel db
        precedentedataora = dataoraattuale 
      end if
    wend
    
    >```
     
    se hai dei dubbi sul codice posta pure
     
    Grazie per aver risposto ed avermi dati almeno la speranza che si può fare.
     
    Non ho ben capito il tuo suggerimento, forse se ti posto il codice originale, puoi spiegarmi meglio, ti dispiace ? :D :
     
    

    PercorsoCSV = "D:\Inetpub\wwwroot\Folder\test.csv "

    '//INIZIALIZZO L'OGGETTO FSO
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

    '//APRO IL FILE CSV
    Set objFile = objFSO.OpenTextFile(PercorsoCSV)

    '//SALTO LA PRIMA RIGA DELLE INTESTAZIONI
    objFile.SkipLine()

    '//INIZIO CICLO
    Do While Not objFile.AtEndOfStream

    '//LEGGO RIGA PER RIGA
    strText = objFile.readLine

    '//SPLITTO IL TESTO PER VIRGOLA PER IL NUMERO VALORI DA LEGGERE PER RIGA
    arrText = split(strText, ",", 17)

    '//INSERISCO NEL DB ACCESS
    strSql = "INSERT INTO ... "
    cn.execute(strSql)

    '//FINE CICLO
    Loop

    '//CHIUDO E DISTRUGGO OGGETTO
    objFile.Close()
    Set objFile = Nothing

    '//DISTRUGGO OGGETTO
    Set objFSO = Nothing


  • User

    Dunque ho risolto in parte, il codice aggiornato è questo:

     
    PercorsoCSV = "D:\Inetpub\wwwroot\Folder\test.csv "
     
      '//INIZIALIZZO L'OGGETTO FSO
      Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
     
      '//APRO IL FILE CSV
      Set objFile = objFSO.OpenTextFile(PercorsoCSV)  
     
      '//SALTO LA PRIMA RIGA DELLE INTESTAZIONI
      objFile.SkipLine() 
     
      '//DATA DI PARTENZA
      precedentedataora = "01/01/1900 00:00:00" 
     
      '//INIZIO CICLO
      Do While Not objFile.AtEndOfStream
     
      '//LEGGO RIGA PER RIGA
          strText = objFile.readLine 
     
      '//SPLITTO IL TESTO PER VIRGOLA PER IL NUMERO VALORI DA LEGGERE PER RIGA
          arrText = split(strText, ",", 17)
     
    '//COSTRUZIONE STRINGA PER CONFRONTO
        DataCostruita =  convertDate(replace(arrText(2), """", ""))
        OraCostruita = replace(arrText(3), """", "")
     
        strDataOraCostruita = DataCostruita & " " & OraCostruita
     
    '//CONTROLLO ORARIO
    if datediff("n", precedentedataora, strDataOraCostruita) >= 30 then
     
    '//INSERISCO NEL DB ACCESS
          strSql = "INSERT INTO ... "
          cn.execute(strSql) 
     
          precedentedataora = strDataOraCostruita 
     
    '//FINE CONTROLLO ORARIO
    end if
     
    '//FINE CICLO
    Loop
     
    '//CHIUDO E DISTRUGGO OGGETTO
      objFile.Close()
      Set objFile = Nothing
     
    '//DISTRUGGO OGGETTO
      Set objFSO = Nothing
    
    

    Ed in effetti quando l'orario tra una riga e l' altra è inferiore a 30 minuti non la registra: è già un buon passo.

    Mi sono reso conto, però, che ho un altra difficoltà da superare:

    • La riga del file CSV va esclusa non solo quando l'ora del precedente record e quella del record successivo presentano una differenza in minuti è maggiore di 30, ma anche quando i dati del precedente record e quelli del record successivo sono uguali...

    Che problema... 😞


  • User Attivo

    e non te la esclude comunque?
    Quando i due record sono uguali i 30 min di differenza non ci sono quindi dovrebbe comunque escluderlo.


  • User

    @tonyx said:

    e non te la esclude comunque?
    Quando i due record sono uguali i 30 min di differenza non ci sono quindi dovrebbe comunque escluderlo.

    Grazie, ho risolto prevedendo un'ulteriore condizione if... end if

    :ciauz: