Gestire 400000 record excel C#

lunedì 04 giugno 2012 - 00.30

beguroto Profilo | Junior Member

Ciao a tutti,

vi scrivo per chiedervi dei suggerimenti e consigli su come gestire piu di 400000 record presenti su un foglio excel nel modo piu rapido possibile.
Ho la necessità di filtrare in base ai valori di alcune colonne.

Pesavo di copiare tutti i record su un db access per poi elaborarli mediante ADO .net (C#).

Qualcuno potrebbe darmi qualche consiglio? Avete del codice come esempio per copiare dati da excel su access ed elaborarli mediante ADO .net?
Dovrei inoltre cercare tutti i record doppioni ed eliminarli per copiarli su una tabella a parte (devo tnerne traccia dei doppioni).

Spero di ricevere i vostri preziosi consigli al piu presto.

Grazie

Begs

luigidibiasi Profilo | Guru

bhe se son solo 400.000 puoi anche metterli tutti in RAM o no?
quante colonne sono?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Ciao,

sono 40 colonne con 400000 record da analizzare.

Come ti accennavo, devo filtrare i 400000 record a cascata, partendo dalla colonna 1 (per data), poi filtrare i record che rimangono per importo (colonna 2) e poi verificare i record doppioni: eliminarli dal foglio excel attivo e salvarli su un secondo foglio excel per aver traccia di ciò che ho rimosso.

Come mi consigli di procedere?

Ho impostato una macro in excel ma impiega un' eternità per generare il risultato.

Pensavo ad ADO .net: hai qualche consiglio e/o suggerimento? Hai degli esempi da visionare?

Cosa intendi per "posizionarli sulla RAM"?

Purtroppo ho la necessità di avere un risultato nel minor tempo possibile.

Grazie per il supporto.

Begs

luigidibiasi Profilo | Guru

facciamo un passo alla volta...

>sono 40 colonne con 400000 record da analizzare.
sono 16 milioni di items... un bel po' di dati (averli in un foglio excel è stata una tua idea????)

>
>Come ti accennavo, devo filtrare i 400000 record a cascata, partendo
>dalla colonna 1 (per data),
per filtrare intendi: devo selezionare solo ALCUNI record che soddisfano un criterio?

>poi filtrare i record che rimangono
>per importo (colonna 2) e poi verificare i record doppioni:
come sopra?

>
>Cosa intendi per "posizionarli sulla RAM"?
>
vediamo prima se possiamo farlo ... dammi le prime due risposte

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Ciao,

dunque, l' idea di avere i dati su un file excel non è la mia: purtroppo ricevo questo file excel da terzi e devo purtroppo analizzarlo per estrarre dei dati.


Si, devo selezionare solo quelle righe che soddisfano i seguenti criteri: anno data=2011, importo > x, società=AAA (per esempio...)

Fatto ciò dovrei rimuovere tutte le righe che sono dei doppioni ma non devo cancellarle: devo tenerne traccia su un' altro foglio di lavoro, rimuovendole dal foglio di lavoro filtrato.

Spero di essere stato più chiaro.

Grazie e buona giornata,

Begs

luigidibiasi Profilo | Guru

Un'altra cosa... devi per forza lavorare sui fogli excel?
Nel senso... devi filtrare e rigenerare per forza una nuovo foglio con i doppioni tolti etc etC?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Non necessariamente: solo il file di origine è obligatoriamente un file excel.

Posso utilizzare qualsiasi altro formato purchè non perda le informazioni del file originale.

Dovrò, dunque, tenere traccia di tutto ciò che viene filtrato ed eliminato.

In attesa di consigli ti ringrazio per la disponibilità.

Begs

luigidibiasi Profilo | Guru

Ciao,
scusa per il ritardo ma mi ero completamente scordato del post...

>Posso utilizzare qualsiasi altro formato purchè non perda le
>informazioni del file originale.

>In attesa di consigli ti ringrazio per la disponibilità.
>

Hai pensato di utilizzare le classi SortedDictionary per metterti in memoria i record
e farti eseguire l'ordinamento da .net?

In pratica se ho capito bene il tuo è solo un problema di velocità...?

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Purtroppo non conosco le classi SortedDictionary: avresti qualche esempio che potrebbe fare al caso mio?
La mia idea era quella di utilizzare una datagrid view in cui caricare il file excel per poi filtrarla tramite query.
Introdurrei una seconda datagrd view in cui salvare ciò che ma mano viene scartato dalle query: credi sia fattibile?
Come potrei fare per salvare sulla seconda datagrid view il risultato della "non query"? Esistono metodi per implementare il tutto efficacemente?

Grazie
Begs

luigidibiasi Profilo | Guru

>Purtroppo non conosco le classi SortedDictionary: avresti qualche
>esempio che potrebbe fare al caso mio?



>La mia idea era quella di utilizzare una datagrid view in cui
>caricare il file excel per poi filtrarla tramite query.
>Introdurrei una seconda datagrd view in cui salvare ciò che ma
>mano viene scartato dalle query: credi sia fattibile?

non è una buona idea poiché la datagrid standard è molto lenta... è utile solo per visualizzare idati


>Come potrei fare per salvare sulla seconda datagrid view il risultato
>della "non query"? Esistono metodi per implementare il tutto
>efficacemente?
>
i dati devi caricarli in memoria e poi giocare sempre in memoria prima di darli in output alla griglia.

facciamo così...
puoi allegare la struttura dei dati originali con 20-30 record?

poi mano mano cerchiamo di implementare le varie operazioni...

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Ciao,

come esempio, ti allego il file excel in cui ho riportato la struttura che dovrei prendere in considerazione per l' analisi dei dati.

Le colonne da considerare sono:

Colonna 1 - Gestore

Colonna 3 - Data

Colonna 5 - Data inizio

Colonna 6 - Data fine

Colonna 10 - Codice identificativo cliente

Colonna 12 - Importo

Di seguito le opeazioni che dovrei effettuare:

1° Filtro: dalla matrice allegata nel file xls, devo filtrare tutti i record in cui Gestore = Aaa (gestore selezionabile da utente)

2° Filtro: dalla matrice che ottengo dopo il primo filtro devo filtrare ulteriormente per Data -> La date da tenere devono appartenere al 2010 (anno selezionabile da utente)

I record che rimangono dopo il primo e il secondo filtro devo analizzarli per verificare che non ci siano doppioni:

-> Le colonne da considerare per il check dei doppioni sono: Colonna 10 - Codice identificativo cliente; Colonna 5 - Data inizio; Colonna 6 - Data fine; Colonna 12 - Importo

Se i record che rimangono dopo il 1° e 2° filtro risulteranno essere:

a) Uguali per : Colonna 10 - Codice identificativo cliente; Colonna 5 - Data inizio; Colonna 6 - Data fine; Colonna 12 - Importo, dovrò cancellare tutti i record doppioni e tenerne soltanto uno

b) Uguali per : Colonna 10 - Codice identificativo cliente; Colonna 5 - Data inizio; Colonna 6 - Data fine ma differiscono per Colonna 12 - Importo, dovrò spostare tutte le righe su una matrice che chiamerò DA ANALIZZARE e tenere il primo record sulla matrice originale filtrata ed elaborata (come da filtro 1, filtro 2, analisi a e analisi b)

Alla fine dunque dovrò avere due matrici distinte: una "BUONA" ed un' altra da esaminare "manualmente" in cui dovrò verificare puntualmente i doppioni.

Per la matrice buona infine dovrò avere la somma totale degli importi degli items che rimangono (Colonna 12 - Importo)

In attesa di suggerimenti, ringrazio per la disponibilità.

Buona giornata,

Begs

beguroto Profilo | Junior Member

Ciao a tutti,

avete qualche suggerimento da darmi o qualche esempio dal quale prendere spunto?

Grazie e buona giornata,

Begs

luigidibiasi Profilo | Guru

Se i record che rimangono dopo il 1° e 2° filtro risulteranno
>essere:
>
>a) Uguali per : Colonna 10 - Codice identificativo cliente; Colonna
>5 - Data inizio; Colonna 6 - Data fine; Colonna 12 - Importo,
>dovrò cancellare tutti i record doppioni e tenerne soltanto uno
>
>b) Uguali per : Colonna 10 - Codice identificativo cliente; Colonna
>5 - Data inizio; Colonna 6 - Data fine ma differiscono per Colonna
>12 - Importo, dovrò spostare tutte le righe su una matrice che
>chiamerò DA ANALIZZARE e tenere il primo record sulla matrice
>originale filtrata ed elaborata (come da filtro 1, filtro 2,
>analisi a e analisi b)
>
>Alla fine dunque dovrò avere due matrici distinte: una "BUONA"
>ed un' altra da esaminare "manualmente" in cui dovrò verificare
>puntualmente i doppioni.
>
>Per la matrice buona infine dovrò avere la somma totale degli
>importi degli items che rimangono (Colonna 12 - Importo)
>
>In attesa di suggerimenti, ringrazio per la disponibilità.
>
>Buona giornata,
Ciao,
ho appena guardato l'esempio...

dimmi un'ultima cosa e poi ti posto il codice... è con VBA che va' lento giusto?


Per te sarebbe un problema salvare il file come "testo con tabulazioni" eseguire le operazioni li sopra e poi rimetterlo in excel?

>
>Begs
>

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Ciao,

grazie per l' interessamento.

Si, in VBA è estremamente lento.

Nessun problema per la soluzione proposta.

Grazie davvero: non vedo l' ora di studiare la soluzione che hai in mente di implementare.

In attesa, ti ringrazio per l' aiuto.

Begs

beguroto Profilo | Junior Member

Ciao Luigi,

credi sia fattibile implementare tutto ciò?
Medinate excel VBA è diventato impossibile gestire il tutto ...

Grazie,

Begs

luigidibiasi Profilo | Guru

sto facendo delle prove...
credo faro' tutto in un file di testo perché vba non ha strumenti adeguati

scusami se sono un po' lento a rispondere ma a volte mi perdo le mail che mi arrivano
da dotnethell

se hai un contatto skype o altro facciamo prima comunque!!

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Ciao Luigi,

al momento sono al lavoro e non c'è possibilità di usare skype.

Sono molto curioso su come aggirerai l' ostacolo VBA excel: spero tu possa darmi qualche buona notizia al più presto.

Grazie davvero.

Begs

luigidibiasi Profilo | Guru

guarda l'idea di base è semplice

converto excel in file di testo separato coi tabulatori
(la tua struttura che hai allegato permette di farlo... se quella finale è diversa dimmelo prima!!)

apro uno stream di input
apro 2 stream di output

'leggo una riga alla volta
r = stream.readline

' applico i filtri per decidere in quale flusso di output vanno scritti i dati
scrivo la linea nel flusso

next line


alla fine mi trovo 2 file parsati in base ai filtri che ho messo...

reimporto i due file in excel


ti ho chiesto il contatto skype perché dobbiamo comunque provare le performance
ti passavo il codice, lo provavi e vedevi come andava...

con 30 linee non riesco a rendermi conto



Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

beguroto Profilo | Junior Member

Ciao Luigi,

la struttura del file è quella che ti ho postato in precedenza: l' unica differenza è il quantitativo dei dati da analizzare in termini di righe. Il file che ti ho allegato è stato generato con office 2003: quello da gestire, dato il quantitativo dei dati è generato da office 2007 o 2010 a seconda della macchina che lo estrae.

Grazie mille,

Begs

beguroto Profilo | Junior Member

Ciao Luigi,

credi sia un problema il fatto che il file excel da analizzare venga generato mediante MS Office 2007/2010 piuttosto che MS Office 2003?

Grazie,

Begs

luigidibiasi Profilo | Guru

No nessun problema
Domani ti allego una bozza da cui potrai continuare
Sperando che non Ho fatto confusione;)
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

luigidibiasi Profilo | Guru

fai una cosa... il tuo file excel salvalo come FORMATO TESTO CON TABULAZIONI
e provaci questo codice sopra...

vedi un po' quanto ci mette a scorrerlo...
Dim io As IO.StreamReader = New IO.StreamReader("C:\temp\toanalize.txt") Dim firstFilter As String = "Aaa" Dim secondFilter As String = "25/03/2010" Dim filter1 As ArrayList = New ArrayList '# read all the line Dim tmp As String While Not io.EndOfStream tmp = io.ReadLine '# APPLICA I DUE FILTRI. (IPOTIZZO CHE LA DATA CHE CONSIDERI SIA LA TERZA COLONNA?) '# qua va ottimizzato... chiamata 2 volte split If tmp.Split(vbTab)(0) = firstFilter And tmp.Split(vbTab)(2) = secondFilter Then '# linea da considerare poiché matcha col filtro '# qui va il check per i doppioni prima di inserire '# nell'array End If End While
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5