È soltanto un Pokémon con le armi o è un qualcosa di più? Vieni a parlarne su Award & Oscar!
 
Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Importare ed unire più file CSV in Excel

Ultimo Aggiornamento: 18/06/2015 11:37
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 [SM=x423030] ), 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

Re:
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! [SM=x423028]

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
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 08:34. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com