› Excel e gli applicativi Microsoft Office › Eliminazione duplicati
-
AutoreArticoli
-
Ciao, ho cercato di migliorare il codice per i tempi, ma non riesco ad arrivare ai risultati di scossa, io modello base lui Sport
Io per eliminare e trascrivere i dati del tuo primo file di prova (2570 righe mi sembra) sono arrivato a 19,23 secondi.
Quindi sul totale sono nettamente piu' lento.
In ogni caso allego il file.
Allegati:
You must be logged in to view attached files.Secondo te è possibile correggere le problematiche per i punti 2 e 3 ?
Per il punto 2: nella parte del codice sottoindicata aggiugi le righe segnalate:
On Error Resume Next For Each rRow In rngFr.Rows aRow = rRow.Value With Application aRow = .Transpose(.Transpose(aRow)) End With aRow(6) = "" '<------- aggiungere aRow(7) = "" '<------- aggiungere aRow(8) = "" '<------- aggiungere sKey = Join(aRow, "§") sItem = rRow.Offset(0, -7).Cells(1, 1).Value cValid.Add sItem, sKey If Err.Number Then cDup.Add rRow.Row Err.Clear Next rRow On Error GoTo 0per il punto 3, nel file che hai allegato, il codice, corretto come sopra, elimina solo le 42 righe della stazione 0129-MS00730_TR12 e nessuna delle altre indicate.
Ciao, ho cercato di migliorare il codice per i tempi, ma non riesco ad arrivare ai risultati di scossa, io modello base lui Sport
Meglio di quanto pensassi
. Per processare gli oltre 536000 dati ha impiegato circa 14 minuti. Il tuo programma ha in parte risolto alcune problematiche già emerse con la versione ultima di Scossa.Vado al dunque.
Per il gruppo di stazioni (es.: IT_m1lt01_12) con duplicati non effettivi eliminati da Scossa, la routine di Aldo ha individuato molti meno duplicati che però, andando ad analizzare sono reali. Per la stazione IT_m1lt01_12 nella campagna 2/19 e 4/19 il disco secchi è un parametro duplicato sia per il valore che per la quota, invece nella campagna 6/19 avviene quanto già emerso per la stazione 0129-MS00730_TR12, cioè alle due quote (SampleDepth) di 0,5m e 25m, per alcuni di questi 8 parametri (Secchi disk depth, Ammonium, Nitrate, Nitrite, Orthophosphate, Orthosilicate, Total nitrogen e Total phosphorus) sono stati trovati duplicati. Andando a vedere i dati originali si osserva che per la quota 0,5 gli 8 parametri sono presenti due volte, però per alcuni di essi (Secchi disk depth, Ammonium, Nitrite e Orthosilicate) i valori del campo “Concentration” sono uguali, e quindi vengono considerati dalla routine duplicati, eliminati da Foglio1 e copiati in DatiDuplicati, mentre per altri (Nitrate, Orthophosphate, Total nitrogen e Total phosphorus) i valori del campo “Concentration” sono diversi e quindi non vengono considerati dalla routine duplicati. Ai fini delle elaborazioni successive dei dati, per ciascuna stazione e per ciascuna campagna o data di monitoraggio ad una determinata quota non può essere associato lo stesso parametro due o più volte, anche se il valore del campo “Concentration” è diverso. Quindi per far in modo che la routine elimini tutti i duplicati reali per le due stazioni, IT_m1lt01_12 e 0129-MS00730_TR12, bisogna eliminare il campo “Concentration” (colonna O) quale criterio per la ricerca dei duplicati e mantenere SampleDeath (colonna P). Cioè sole se esistono due record o righe con lo stesso valore dei campi MRU, Region, NationalStationID, SeaDepth, Year, Month, Day, Determin_Nutrients, SampleDepth vanno considerati duplicati; quindi escludiamo il campo Concentration per definire la condizione di righe duplicate. Quindi nel caso per una stazione (es.: IT_m1lt01_12) in una determinata data di monitoraggio (es.: 4/6/2019) esistono alla stessa quota di 0,5 m due valori di Concentration diversi per il parametro Nitrate, una delle due righe o record, a caso, dovrà essere considerata un duplicato, e quindi eliminata e copiata.
Nel file allegato ho messo in Foglio1 i dati completi delle due stazioni, IT_m1lt01_12 e 0129-MS00730_TR12, e in DuplicatiAllData i duplicati copiati dal tuo programma che trovi anche nel file.
Scusami, per la perdita di tempo, ma se puoi fare la correzione per la problematica emersa per queste stazioni, te ne sono grato. Altrimenti non ti preoccupare, posso risolvere anche manualmente. Il grosso dei duplicati è stato individuato ed eliminato. Purtroppo questi problemi sono dovuti alla non corretta gestione dei dati dalle diverse ARPA regionali che mi inviano i dati. Potrebbe accadere che nei dataset degli altri anni che sto esaminando potrebbero comparire altre piccole problematiche, ma credo che grazie a te, scossa e agli amici del forum, la stragrande maggioranza dei duplicati viene individuata ed eliminata.
Allegati:
You must be logged in to view attached files.Se non ho capito male ho estratto meno righe di quelle dovute, ma corrette. Qundi non conviene fare una seconda passata sulle righe rimaste con il codice variato nelle condizioni?
Se non ho capito male ho estratto meno righe di quelle dovute, ma corrette. Qundi non conviene fare una seconda passata sulle righe rimaste con il codice variato nelle condizioni?
Esatto. Purtroppo la struttura dei dati è abbastanza complessa. Non ti preoccupare fai le modifiche al codice e io lo faccio girare sui dati orinali.
C'è una cosa che volevo chiederti. E' possibile migliorare le prestazioni di Excel in termini di velocità, modificando qualcosa sia nella configurazione del programma che nella configurazione del mio portatile (memoria, chip, ...) ?
Grazie mille.
Secondo te è possibile correggere le problematiche per i punti 2 e 3 ?
Ciao.
Purtroppo Scossa l'aggiunta delle 3 linee di codice ha creato il doppio dei duplicati (oltre 50000) e prolungato enormemente i tempi di esecuzione (circa 4 ore). Inoltre vengo segnalati dei duplicati che duplicati non sono. Ci deve essere qualche problema.
Purtroppo Scossa l'aggiunta delle 3 linee di codice ha creato il doppio dei duplicati (oltre 50000) e prolungato enormemente i tempi di esecuzione (circa 4 ore). Inoltre vengo segnalati dei duplicati che duplicati non sono. Ci deve essere qualche problema.
Quelle 3 righe di codice non fanno altro che escludere le tre colonne M N O (NutrientsSeawater_unit
LOD_LOQ_Flag Concentration), prova a togliere le prime due e lascire solo l'ultima ( aRow(8) = "" ).Purtroppo senza il file originale completo si fa poco, mi spiace.
Ti allego il file cn la macro corretta. Non controlla più i dati in colonna 15 (O). Il resto rimane invariato.
Allegati:
You must be logged in to view attached files.Ti allego il file cn la macro corretta. Non controlla più i dati in colonna 15 (O). Il resto rimane invariato.
Ciao Aldo.
Allora il tuo codice ora funziona anche se ho dovuto fare una piccola modica al codice
For i = 4 To 16 'If i <> 15 Then 'codice di Aldo If i <> 15 And i <> 14 Then 'codice di Pask 14=colonna del campo "LOD_LOQ_Flag"Ho verificato che alcuni duplicati tipo:
Col 13 14 15
Total Nitrogen 0,40
Total Nitrogen < 0,25differenziavano non soltanto per la colonna 15 (Concentration) ma anche per la colonna 14 (LOD_LOQ_Flag), per cui bisognava escludere oltre alla colonna 15 anche la colonna 14. Io ho fatto la modifica sulla base delle mie poche reminescenze di VBA e di un po' di intuito. Comunque il tuo codice credo sia molto veloce: impiega circa 14 minuti per processare tutti i dati.
La sai una cosa strana. Venerdì ho eseguito il tuo codice su circa 20000 righe. Il PC fisso, una workstation con Xeon e 64 Gb di Ram ha impiegato qualche secondo in più del mio portatile Lenovo i7vPro 32 Gb di Ram !!!
Grazie mille Aldo per la disponibilità data fino alla soluzione del problema, ma anche agli altri come Scossa e tutti gli altri che hanno dato comunque un loro contribuito.
Un ultima domanda. E' possibile ottimizzare le prestazioni di EXCEL, impostando più RAM per il programma ? Oppure attraverso altre modifiche ?
Un ultim
-
AutoreArticoli
