Trovare i doppioni di righe
Ormai sono 10 mesi che sto dietro ai dati di 10 anni della mia stazione meteo e devo ammettere che il software di gestione dato in dotazione è pieno di problemi e bug.
Succede che per un qualche motivo a me sconosciuto, ma che scoprirò, vengono registrate delle doppie registrazioni. Credo, ma non ne ho avuto conferma, che se scarica i dati solari prima e poi quelli dei sensori meteo, vengono create le doppie righe. Non sono tante (un centinaio su un milione di righe) però danno fastidio e le voglio eliminare.
Ma come faccio a trovare cento righe su un milione? E’ come cercare un ago in un pagliaio. Innanzitutto, come ho scoperto la presenza di queste righe? Se dalla query SELECT * FROM DataLog che mi dà il milione di righe, io la modifico in SELECT DISTINCT * FROM DataLog, quindi aggiungo il “DISTINCT”, vedo che mi dà queste 100 righe in meno.
Quindi come le troviamo queste righe? Ho provato a fare il copia e incolla su Excel e poi con i subtotali, ma ci impiega settimane, ho provato a ordinare per data e poi mettere una formula per calcolare la differenza con la riga superiore. Se la differenza è zero, allora nella riga prima c’è la stessa data.
Ma anche in questo caso Excel “EXplode” e se metto in ordine di differenze mette in ordine di come vuole lui. Ho forse scoperto un bug su Excel? Non mi interessa, a me interessa che i dati del Metelog siano ok.
Oppure non li trova.
Andiamo avanti.
Ecco che penso che sono anche un programmatore e mi creo un programmino in VB.NET e poi mettendo un ciclo dove verifico quante righe ci sono per ogni data e dove è maggiore di 1 me lo scrive su un file di testo.
Ecco quindi il codice e il risultato.
Dim enti As New crystalweb_it_meteoEntities
Dim linqu = (From www In enti.DataLog Order By www.Realtime Select www.idLog, www.Realtime).ToList
FileOpen(1, My.Application.Info.DirectoryPath & "\datedoppie.txt", OpenMode.Output)
For Each qqq In linqu
Dim idLog = qqq.idLog
Dim RealTime = qqq.Realtime
Dim linquu = (From wwww In enti.DataLog Where wwww.Realtime = RealTime).ToList
If linquu.Count > 1 Then
Write(1, idLog & ";" & RealTime)
End If
Next
FileClose(1)
Enti è l’oggetto Data Entities, collegato su app.config.

Per questa fase è tutto, ora nuova e forse ultima fase (e forse articolo).
Rispondi