| | Post: 1 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
16/06/2015 18:55 | |
Ciao a tutti,
sono nuovo qui, mi chiamo Alessandro e sono uno studente universitario in Ingegneria Gestionale.
Sono alle prese con la tesi di laurea e devo lavorare con grandi tabelle di dati.
Vi spiego il mio problema:
Un sito web mette a disposizone dati di mio interesse, il download genera un file CSV da ben 2.2GB che Excel 2013 non riesce ad aprire per via del numero troppo elevato di righe.
Allora ho trovato in rete un software che mi permette di spezzare questo file CSV in tanti altri CSV (in pratica da 1 CSV ne ottengo 200, ogniuno da circa 25MB)
Questi CSV contengono molti dati che non mi servono, quindi ciò che volevo fare è:
importare mano a mano (in ordine) i 200 CSV in un worksheet di excel disponendo in maniera adeguata i dati su più colonne MA mi interessa importare o comunque salvare solo le righe che contengono celle con un determinato testo.
Ad esempio: i file CSV hanno una colonna chiamata COLORE che può avere come valori [giallo,arancione,verde,rosso o blu], io voglio salvare solo le righe che presentano celle in cui ci sia scritto solo [verde] oppure [giallo].
Come posso fare?
Grazie infinite
Alssandro |
|
| | Post: 772 | Registrato il: 21/06/2013
| Città: NAPOLI | Età: 70 | Utente Senior | Excel 365 | | OFFLINE |
|
16/06/2015 20:30 | |
Ciao Alessandro
Lungi da me il pensiero che il mio intervento possa essere per te risolutivo ma per cominciare ad analizzare il problema dovresti:
1) Allegare qualche file csv di esempio.
2) indicare quali sono i dati di tuo interesse da importare sul foglio
3) Dire quali elaborazioni debbano essere effettuate sul foglio
4) altro
Una volta definite e funzionanti tutte le operazioni da effettuare sul singolo file si potrà pensare di ciclare (con la funzione Dir) la directory contenente i file csv ed effettuare su tutti quello che è stato fatto sul singolo.
Spero di essere stato chiaro.
Ovviamente altri interventi in proposito (per avvalorare o meno il mio pensiero) saranno più che graditi. [Modificato da alfrimpa 16/06/2015 20:39]
Alfredo |
| | Post: 1 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
17/06/2015 16:53 | |
Ti ringrazio per la cortese risposta
Ho allegato un CSV di esempio con poche righe (io ho 40 di questi CSV ogniuno da circa 1 milione di righe).
Voglio importarli uno dopo l'altro in un solo worksheet tenendo solo le righe che presentano come "Freeway" il valore 805 e come "Direction" il valore N ed eliminando tutte le altre righe.
Grazie mille
Alessandro Excel 2013 64bit |
| | Post: 777 | Registrato il: 21/06/2013
| Città: NAPOLI | Età: 70 | Utente Senior | Excel 365 | | OFFLINE |
|
17/06/2015 18:21 | |
Scusa Alessandro una domanda: ma il file che hai allegato è si un CSV ma mi si apre direttamente in Excel.
Lo hai salvato tu in Excel come file CSV?
Comunque se è così è ancora meglio.
Alfredo |
| | Post: 189 | Registrato il: 06/04/2013
| Utente Junior | 2010 | | OFFLINE |
|
17/06/2015 18:24 | |
Ciao
dopo aver variato la cartella di riferimento, prova su un file xls vuoto (la macro da eseguire è importData, stampa serve x "stampare" il record trovato):
Sub importData()
Application.ScreenUpdating = False
Dim InputData, rec, l, Freeway, Direction
mFolder = "c:\MiaCartella\" '<<<<<<<<<<<<<<<< CAMBIARE
strFile = Dir(mFolder & "*.csv")
l = 1
Do While strFile <> ""
Open mFolder & strFile For Input As #1
Do While Not EOF(1)
Line Input #1, InputData
rec = Split(InputData, ",")
If l = 1 Then
l = Stampa(rec, l)
Else
Freeway = rec(2)
Direction = rec(3)
If Freeway >= "805" And Direction = "N" Then
l = Stampa(rec, Range("A" & Rows.Count).End(xlUp).Row + 1)
End If
End If
Loop
Close #1
strFile = Dir
Loop
Application.ScreenUpdating = True
End Sub
Function Stampa(records, lineNo)
Dim i
For i = 0 To UBound(records)
ActiveSheet.Cells(lineNo, i + 1) = records(i)
Next
End Function
saluti
Edit: tolto refuso da macro stampa [Modificato da dodo47 17/06/2015 18:40] Domenico
Win 10 - Excel 2016 |
| | Post: 2 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
17/06/2015 20:12 | |
Grazie mille per la risposta
Ho provato a creare la macro utilizzando il codice che mi hai scritto ma mi ritorna errore di sintassi alla riga
Open mFolder & strFile For Input As #1
(ho cambiato la cartella come mi hai detto) Excel 2013 64bit |
| | Post: 3 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
17/06/2015 20:28 | |
Ti allego anche un screenshot se può esserti utile
Sono proprio un neofita con le macro non so ancora interpretare bene gli errori purtroppo :( Excel 2013 64bit |
| | Post: 191 | Registrato il: 06/04/2013
| Utente Junior | 2010 | | OFFLINE |
|
18/06/2015 09:37 | |
Ciao
non saprei cosa rispondere, quelle macro le ho naturalmente testate e funzionano a dovere. Prova a vedere l'help per la sintassi di Open, il 2003 recita:
Esempio di istruzione Open
In questo esempio vengono illustrati i vari utilizzi dell'istruzione Open per eseguire operazioni di input/output su un file.
Il codice che segue apre il file in modalità input sequenziale.
Open "FILEPROV" For Input As #1
Ovviamente, essendo path e file all'interno delle variabili, le " vanno omesse.
Non ho Excel 2013 e pertanto non posso ulteriormente aiutarti.
Mi sembra comunque strano che una semplice open su file csv e/o txt diano errore.
Io ho provato sul file che mi hai inviato tu, anzi l'ho duplicato per vedere se era corretto il loop di lettura e ti assicuro che funziona.
Il messaggio di errore che dice ?
Se fai un debug, dopo l'istruzione: Do While strFile <> "", che c'è in strFile?
A parte questo, spero che altri con il 2013 intervengano.
saluti
Tra l'altro c'è un errore che non ha influenza sul funzionamento:
If Freeway >= "805" And Direction = "N" Then
deve essere:
If Freeway = "805" And Direction = "N" Then
[Modificato da dodo47 18/06/2015 09:59] Domenico
Win 10 - Excel 2016 |
| | Post: 1.931 | Registrato il: 03/04/2013
| Utente Veteran | Excel 2000 - 2013 | | OFFLINE | |
|
18/06/2015 10:13 | |
Buona giornata, Alessandro;
intervengo per confermare quanto detto da dodo47 (un caro saluto e buona serata, Domenico).
Con Excel 2013 la proposta di Domenico funziona correttamente.
Ho inserito tre File.csv nella Directory che ho poi indicato nella Variabile:
- mFolder
lanciando Il Codice, tutto viene compilato correttamente.
A margine di quanto sopra, mi ero riproposto anch'io di dare una risposta alla Tua Richiesta, ma, il Codice è decisamente meno performante rispetto a quello proposto da Domenico.
Solo per onor di Firma lo propongo.
Option Explicit
Sub LeggeCopia()
On Error GoTo 10
Application.ScreenUpdating = False
Const Path As String = "C:\prove\AlessandroG90\CSV\"
Dim oExcel As Excel.Application
Dim strFile As String
Dim NRc As Long, NRd As Long
Dim MioFile As String
NRd = Range("A" & Rows.Count).End(xlUp).Row
If NRd < 2 Then NRd = 2
Rows("2:" & NRd).Clear
NRd = 2
MioFile = ActiveWorkbook.Name
Set oExcel = New Excel.Application
strFile = Dir(Path & "*.*")
Do While strFile <> ""
Workbooks.Open Filename:=Path & strFile
Testo
NRc = 2
Do While Cells(NRc, 1) <> ""
If Cells(NRc, 3) = 805 And Cells(NRc, 4) = "N" Then
NRc = NRc + 1
Else
Rows(NRc).Delete
End If
Loop
Rows("2:" & NRc - 1).Copy
Windows(MioFile).Activate
Cells(NRd, 1).Select
ActiveSheet.Paste
NRd = Range("A" & Rows.Count).End(xlUp).Row + 1
Application.DisplayAlerts = False
Workbooks(strFile).Close
strFile = Dir
Loop
Application.DisplayAlerts = True
oExcel.Quit
10:
Set oExcel = Nothing
Application.CutCopyMode = False
Application.ScreenUpdating = True
Cells(2, 3).Select
End Sub
Sub Testo()
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array( _
46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1)), TrailingMinusNumbers _
:=True
Cells.Columns.AutoFit
End Sub
Crea la Directory (Cartella)
- C:\prove\AlessandroG90\CSV\
- inserisci in questa Directory i Tuoi 40 File.csv
- in un File .xlsm inserisci i due Codici sopra proposti
- lancia il Codice dal File .xlsm
In realtà il Codice:
- LeggeCopia
funziona correttamente anche senza il Codice:
- Testo
ma, per sicurezza ho inserito la chiamata a "Testo"
Il tempo di esecuzione sarà sicuramente meno performante rispetto alla Procedura proposta da Domenico, ma, tant'è.
Buona serata.
Giuseppe
Windows XP - Excel 2000
Windows 10 - Excel 2013 |
| | Post: 4 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
18/06/2015 10:33 | |
Buongiorno a tutti,
stamattina ho riprovato e "magicamente" non mi dà più l'errore di ieri sera, fila liscio fino a
Freeway = rec(2)
momento in cui mi avvisa che "l'indice non è compreso nell'intervallo"
Vi ringrazio nuovamente per il supporto!
EDIT: confermo che sul file csv di prova che vi ho sottoposto funziona benissimo!
Vi lascio il link di wetransfer da cui potete scaricare un pacchetto contenente qualche file CSV "originale" così come sono stati scaricati e spezzati.
https://www.wetransfer.com/downloads/6ea2019484a33e57d7c65aed0e84a70020150617144619/014004842bc8b544606a3f9c1c8812ad20150617144619/0b88fb
L'errore me lo restituisce solo se uso questi files [Modificato da AlessandroG90 18/06/2015 10:41] Excel 2013 64bit |
| | Post: 194 | Registrato il: 06/04/2013
| Utente Junior | 2010 | | OFFLINE |
|
18/06/2015 10:37 | |
Ma forse è perché hai inserito la macro in un file xlsx a posto di xlsm ? Non le so queste "diavolerie" moderne!!
Comunque, avuta la benedizione da parte di Giuseppe (grazie reverendo ), se riesci a far funzionare il mio codice, "credo" con ragionevole certezza che rinominando l'originale file da 2GB in txt, e variando nella macro csv in txt, dovresti poter evitare lo split in 25 file evitando anche il loop di lettura...Ma bisognerebbe provare.
Il sito dove scarichi il file è accessibile a tutti? Se si, puoi dirci qual è?
cari saluti [Modificato da dodo47 18/06/2015 10:38] Domenico
Win 10 - Excel 2016 |
| | Post: 5 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
18/06/2015 10:43 | |
Il sito è accessibile a tutti previa iscrizione ma sarebbe problematico portarvi al link esatto di download,
ho editato il mio precedente messaggio, ora contiene un link a wetransfer da cui poter scaricare qualche CSV così come viene scaricato dal sito internet, ora provo su quell intero da 2GB e vi faccio sapere :) Excel 2013 64bit |
| | Post: 195 | Registrato il: 06/04/2013
| Utente Junior | 2010 | | OFFLINE |
|
18/06/2015 10:44 | |
AlessandroG90, 18/06/2015 10:33:
Buongiorno a tutti,
stamattina ho riprovato e "magicamente" non mi dà più l'errore di ieri sera, fila liscio fino a
Freeway = rec(2)
momento in cui mi avvisa che "l'indice non è compreso nell'intervallo"
Vi ringrazio nuovamente per il supporto!
Non c'è nulla di "magico" in Excel...purtroppo!!
ci dici su quale file restituisce l'errore? Lo trovi nella variabile strFile. Sembra, da quel che dici, sembra che tale file abbia 1 o 2 campi soltanto e quindi non trova il campo: rec(2) (cioè il 3° campo dell'array rec, in quanto partono da 0Zero.
saluti
[Modificato da dodo47 18/06/2015 10:48] Domenico
Win 10 - Excel 2016 |
| | Post: 196 | Registrato il: 06/04/2013
| Utente Junior | 2010 | | OFFLINE |
|
18/06/2015 10:47 | |
Ciao
sospettavo che bisognasse iscriversi e, perdonami, ma non ne ho intenzione.
Non puoi allegare un file che va in errore?
SALUTI
EDIT: scusa, l'ho scaricato, ora vedo [Modificato da dodo47 18/06/2015 10:50] Domenico
Win 10 - Excel 2016 |
| | Post: 6 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
18/06/2015 10:50 | |
Vi riporto il link wetransfer da cui scaricare qualche file
https://www.wetransfer.com/downloads/6ea2019484a33e57d7c65aed0e84a70020150617144619/014004842bc8b544606a3f9c1c8812ad20150617144619/0b88fb
[Modificato da AlessandroG90 18/06/2015 10:54] Excel 2013 64bit |
| | Post: 197 | Registrato il: 06/04/2013
| Utente Junior | 2010 | | OFFLINE |
|
18/06/2015 11:04 | |
Ciao
a me non fornisce alcun errore, importati 47273 records in ca. 10 min.
Non saprei cosa altro fare.
Saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 7 | Registrato il: 16/06/2015
| Città: ARENZANO | Età: 33 | Utente Junior | 2013 | | OFFLINE | |
|
18/06/2015 11:37 | |
Tutto OK!
Ho scoperto dove stava l'errore...avevo editato il primo file CSV modificandone la prima riga e me ne ero dimenticato, l'ho messo a posto e funziona tutto!
Vi ringrazio infinitamente!
Buona giornata
Alessandro Excel 2013 64bit |
|
|