Ciao a tutti.
Volevo rendervi partecipi di una mia piccola 'scoperta' sulla concatenazione delle stringhe...
E' da un paio di giorni che, dopo aver messo a nanna i le mie due creature
, lavoro ad un progettino per visualizzare statistiche riguardante dati generati da un anemometro.
Il suddetto anemometro, tramite un plc, salva i dati ogni secondo su compact flash in un file csv, indicando data ora, velocita', qualita' del segnale....
Ora il mio problema iniziale era questo: la data nel file csv aveva un formato del tipo dd/mm/yy hh:nn:ss, che importandolo successivamente in un db sqlite con il seguente codice sqlite3
paolo@hpmilio:~$ sqlite3 eolico.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .separator "\t"
sqlite> .import file.csv log_anemometro
sqlite>
mi rendeva impossibile, all'interno di gambas, creare delle query specificando appunto il periodo di lettura.
A questo punto ho creato una funzione che sostituiva la data incriminata in un formato corretto e allo stesso tempo scriveva in una stringa le insert per accodare i record nella tabella del db:
Public Sub Load(Path As String)
Dim Nx As Integer
Dim Rec As New String[]
Dim Fields As New String[]
$Txt = File.Load(Path)
Rec = Split($Txt, "\n", "", True)
$Query = "BEGIN;" & Chr(10)
For Nx = 0 To Rec.Max
Fields = Split(Rec[Nx], "\t")
$Query &= "INSERT INTO log_anemometro (data,valore,qualita) VALUES ('" & Format$(CDate(Val(Fields[0])), "yyyy-mm-dd hh:nn:ss") & "'," & Fields[1] & "," & Fields[2] & ");" & Chr(10)
ArrayCsv.Add(Fields.Copy())
Next
$Query &= "END;"
End
Con questo codice, con un Rec.Max = 64000, mi rallentava di molto il programma, arrivando a tempi di attesa di oltre due minuti...
Provando ripetutamente a modificare il codice e dopo svariate ore
, sono finalmente arrivato alla soluzione:
Public Sub Load(Path As String)
Dim Nx As Integer
Dim Rec As New String[]
Dim Fields As New String[]
Dim FileTemp As Stream
$Txt = File.Load(Path)
Rec = Split($Txt, "\n", "", True)
FileTemp = Open User.Home &/ "eolico.sql" For Create
Print #FileTemp, "BEGIN;"
For Nx = 0 To Rec.Max
Fields = Split(Rec[Nx], "\t")
Print #FileTemp, "INSERT INTO log_anemometro (data,valore,qualita) VALUES ('" & Format$(CDate(Val(Fields[0])), "yyyy-mm-dd hh:nn:ss") & "'," & Fields[1] & "," & Fields[2] & ");"
ArrayCsv.Add(Fields.Copy())
Next
Print #FileTemp, "END;"
FileTemp.Close()
$Query = File.Load(User.Home &/ "eolico.sql")
End
Come potete notare, la formattazione della data e la creazione della stringa di insert e' uguale alla prima funzione.
Ma con questo sistema ho utilizzato un file esterno ("eolico.sql") per scrivere le varie insert e, una volta finito il ciclo, ho carico la variabile stringa $Query con il file appena creato.
Bene, il tempo di attesa adesso si e' ridotto a soli due secondi!
Spero che questa mia esperienza possa essere di aiuto a chi fa utilizzo massiccio di concatenazioni di stringhe.
Ciao ciao....