Condividi:        

EXCEL: import da .csv con sostituzione carattere

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 10/12/12 13:19

Ciao a tutti,
Sto lavorando su un file .csv in uscita da un database che contiene dei caratteri "sporchi" :cry: (una serie di line breaks) e devo riuscire a sostituirli nel .csv per poter aprire bene il file in excel, altrimenti mi va "a capo" (nuova riga) ogni volta che incontra questo carattere durante l'importazione. Quindi in pratica dovrei sostituire un carattere esadecimale "0A" con un carattere esadecimale "20". Entrambi si presentano come "spazio", anche se non lo sono.

Sto imparando a fare molte cose su excel leggendo da questo forum (grazie!:-)) ma questa operazione proprio non so come affrontarla sul csv ... :oops: mi aiutate a trovare una soluzione o mi date una dritta per riuscirci?
Grazie mille a tutti
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Sponsor
 

Re: EXCEL: import da .csv con sostituzione carattere

Postdi ricky53 » 10/12/12 13:31

Ciao,
con il VBA la soluzione si trova.
E' preferibile, prima di avviare la scrittura della soluzione, avere un tuo file di esempio ma attenzione ai dati riservati.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 11/12/12 11:26

Grazie ricky53 per la tua risposta, :)
ho preparato un file senza dati riservati:

http://rapidshare.com/files/1272667851/testfile.csv

facendo la import in excel si vede dove sono tagliate le righe a causa dei caratteri "sporchi" :-? , mentre aprendo il file in .txt con notepad sembra tutto ok...

Grazie mille ancora per il tuo aiuto
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 13/12/12 10:41

Ciao a tutti, ho trovato una macro del grande Flash30005 qui:
http://www.pc-facile.com/forum/viewtopic.php?t=87646

Codice: Seleziona tutto
Sub MacroEliminaCarSpeciali2()
UR = Range("A" & Rows.Count).End(xlUp).Row
For VS1 = 32 To 255
If VS1 = 42 Then GoTo Salta1
If VS1 = 63 Then GoTo Salta2
If VS1 > 47 And VS1 < 58 Then GoTo esci  'Se numeri salta la routine
If VS1 > 65 And VS1 < 91 Then GoTo esci   'Se lett Maiusc salta la routine
If VS1 > 96 And VS1 < 123 Then GoTo esci  'Se lett minusc salta la routine

        Range("A1:A" & UR).Select
        Selection.Replace What:="" & Chr(VS1) & "", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
        GoTo esci
       
Salta1:
        Range("A1:A" & UR).Select
        Selection.Replace What:="~*~", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
        GoTo esci

Salta2:
        Range("A1:A" & UR).Select
        Selection.Replace What:="~?~", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 esci:
Next VS1

End Sub


ed ho provato a modificarla per sostituire i caratteri "strani" (impostando VS1 per <32), ma non sono riuscita, forse non si puo' applicare a tutti i caratteri? Non riesco a venirne a capo, :oops: mi aiutate a capire dove sbaglio?
Grazie! :)
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: EXCEL: import da .csv con sostituzione carattere

Postdi Flash30005 » 13/12/12 11:11

Ok ma ora dovresti dire (di quel file) quali sono i campi che ti interessano
magari inviando un file di excel ripulito dai campi che non vorresti fossero importati
o meglio scarica questo file
che corrisponde al tuo file.csv importato in excel ed evidenzia cosa dovrebbe rimanere (o cosa eliminare)

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 13/12/12 16:18

Grazie mille Flash30005 per la tua risposta;

Il file viene generato da un'applicazione web nel formato csv.
I dati contenuti nel file sono tutti da mantenere nella import da csv a xls, ad eccezione di un carattere "line feed" (hex "0A") non visibile che viene erroneamente inserito dall'applicazione web che scrive il file csv. Non posso modificare questa applicazione web.

Questo carattere si trova in alcuni (non tutti) i record in colonna "C", all'interno del campo "Nome Cognome". A volte si trova tra il nome ed il cognome, a volte in fondo al cognome, comunque sempre in celle di colonna "C".

A causa di questo errore, facendo la import da csv a xls molti record, in corrispondenza del carattere "line feed" incriminato vengono splittati su due righe. Quello che vorrei evitare e' proprio questa suddivisione su due righe, in modo da avere i record in forma tabellare.

ho messo a questo link: http://rapidshare.com/files/2015487457/ ... e%20ok.xls il file xls come dovrebbe risultare se non contenesse i "line feed".

Grazie ancora per il tuo aiuto :)
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: EXCEL: import da .csv con sostituzione carattere

Postdi Flash30005 » 13/12/12 17:47

Allora...
Inserisci in un modulo del file di excel questa macro
Codice: Seleziona tutto
Sub CreaArch()
Perc = ThisWorkbook.Path & "\"
Dim MyFile, MyStr As String
Worksheets("Foglio1").Cells.Clear
    MyFile = "testfile.csv"  '<<<< Nome del file da processare
    Nric = Mid(MyFile, 1, InStrRev(MyFile, ".") - 1)
    MyStr = ""
    Open Perc & MyFile For Input As #2
    Do Until EOF(2)
        Line Input #2, Riga
        MyStr = Replace(Riga, Chr("10"), "")
        Worksheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = MyStr
Salta:
    Loop
Close #2
Close
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        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)), TrailingMinusNumbers:=True
    Columns("A:N").EntireColumn.AutoFit

    Range("A1").Select
End Sub


Il file "testfile.csv" deve essere (per il momento), contenuto nella stessa directory del file di excel
Avvia la macro ;)

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 14/12/12 18:19

Grazie mille Flash30005!!

la macro e' bellissima,perfettissima, e vederla mentre funziona sembra una magia. Grazie grazie grazie... :) :) :)
Ad una prima occhiata mi sembra difficilissima ma adesso mi metto a studiarla per capire "come" funziona cosi' magari la prox riesco a farla da sola senza impegnare il maestro ... :oops: :) Ancora grazie millissime, anzi di piu'!
Grazie a tutto l'aiuto che ho ricevuto qui Excel non mi sembra piu' una cosa incomprensibile, ma solo un po' complicata... :) Ancora grazie!
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: EXCEL: import da .csv con sostituzione carattere

Postdi Flash30005 » 14/12/12 18:47

Veramente, pensando al fatto che i file potessero essere più di uno
avevo preparato questa macro
Codice: Seleziona tutto
Sub CreaArch2()
Perc = ThisWorkbook.Path & "\"
Dim MyFile, MyStr As String
NFoglio = ActiveSheet.Name
Worksheets(NFoglio).Select
Call ElencoFileTxt
If Dir(Perc & "Archivio", vbDirectory) = "" Then
    MkDir (Perc & "Archivio")
End If
URT = Worksheets("ListaTxt").Range("A" & Rows.Count).End(xlUp).Row
If Worksheets("ListaTxt").Range("A1").Value = "" Then
    Worksheets(NFoglio).Select
    MsgBox "Non ci sono file Csv nella cartella"
    Exit Sub
End If
Worksheets(NFoglio).Cells.Clear
For T = 1 To URT
    MyFile = Worksheets("ListaTxt").Range("A" & T).Value
    Nric = Mid(MyFile, 1, InStrRev(MyFile, ".") - 1)
    MyStr = ""
    Open Perc & MyFile For Input As #2
    Do Until EOF(2)
        Line Input #2, Riga
        MyStr = Replace(Riga, Chr("10"), "")
        Worksheets(NFoglio).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = MyStr
    Loop
Close #2
Close
    If Len(Dir(Perc & "Archivio\" & MyFile)) > 0 Then Kill Perc & "Archivio\" & MyFile
    Name Perc & MyFile As Perc & "Archivio\" & MyFile
Next T
Worksheets(NFoglio).Select
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        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)), TrailingMinusNumbers:=True
    Columns("A:N").EntireColumn.AutoFit
    Range("A1").Select
End Sub
Sub ElencoFile(Direct As String, Estens As String, Inicell As Range)
  Dim i As Integer, f As String
  ChDir Direct
  f = Dir(Estens)
  If f = "" Then Exit Sub
  While f <> ""
    i = i + 1
    Inicell(i) = f
    f = Dir
  Wend
End Sub
Sub ElencoFileTxt()
Perc = ThisWorkbook.Path & "\"
Worksheets("ListaTxt").Select
Range("A1").Select
  With ActiveCell
    Worksheets("ListaTxt").Range(.Cells(1), .End(xlDown)).ClearContents
  End With
    ElencoFile Direct:=Perc, Estens:="*.Csv", Inicell:=ActiveCell
End Sub



La inserisci in un modulo del file che deve avere un foglio chiamato "ListaTxt"
e il foglio ("Foglio1" o altro) di lavoro
Questo file lo inserirai in una cartella insieme a tutti i file .csv che devi processare
Assegni i tasti di scelta rapida (Ctrl+m) alla macro "CreaArch2"
Con foglio1 attivo premi Ctrl+m
Nel foglio1 verranno riportati tutti i dati di ogni file .csv contenuti nella cartella e una volta processati saranno archiviati in una sotto-cartella denominata Archivio per evitare ulteriori processi dei file medesimi.

Fai sapere se tutto ok
questa macro funziona anche se è un solo file e ha il vantaggio che non dipende dal nome del file .csv (che nella macro precedente, invece, era obbligato in quanto scritto nel codice stesso)

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 16/12/12 21:44

Ciao Flash30005!

grazie per la versione ancora piu' evoluta della macro!!
Ho provato a fare tutto quello che mi hai indicato (credo, almeno... :) ) ma quando uso ctrl+m per eseguire il tutto ottengo un errore ... prtscrn qui: http://rapidshare.com/files/2523548305/prtscrmacroxfilescsv.jpg "tipo definito dall'utente non definito"
Ho provato un po' a capire dove sbagliavo, ma non ci sono riuscita :oops:
Domani riprovo !!! Grazie mille per la megamacro!
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: EXCEL: import da .csv con sostituzione carattere

Postdi Flash30005 » 17/12/12 00:57

Quello che vedo nell'immagine non appartiene alla mia macro
quindi, chiudi excel e apri questo file
dopo averlo salvato in una cartella contenente anche i file .csv
poi premi Ctrl+m
e fai sapere

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 19/12/12 08:45

Hai ragione Flash3005, il modulo che da questo errore probabilmente dipende da una versione di excel diversa (io sono partita da un foglio vuoto quindi non dovrebbero esserci macro dentro, giusto?) o forse dal fatto che il file salvato era un xlsx con macro e non un xls "normale"....

La macro che hai preparato e' grandiosa e permette di elaborare tutti i files della directory, ed e' velocissima!!!!!!!!!!!! Grazie ancora!

Se posso permettermi ti vorrei fare una domanda "didattica" ne approfitto perche' cerco di imparare tutto quello che posso....: :oops: la prima volta che faccio partire la macro, alla fine dell'esecuzione, lascia l'ultima cella in colonna A come se contenesse, tutto in una cella, l'ultimo record. Se pero' cancello tutte le righe valorizzate, ricopio i files dalla dir Archivio in quella di lavoro e rifaccio partire la macro questo non succede piu'... forse devo posizionare il cursore in una cella specifica prima di far partire la macro? Dove sto sbagliando?

Grazie per tutto :) :)
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31

Re: EXCEL: import da .csv con sostituzione carattere

Postdi Flash30005 » 19/12/12 23:44

Ho notato che con excel 2010 quella macro (parte finale), a volte, dava problemi
sostituisci solo questa macro "CreaArch2" (ho indicato solo la parte da sostituire ma puoi sostituire l'intera macro lasciando inalterate le altre).
Codice: Seleziona tutto
Sub CreaArch2()
Perc = ThisWorkbook.Path & "\"
Dim MyFile, MyStr As String
NFoglio = ActiveSheet.Name
Worksheets(NFoglio).Select
Call ElencoFileTxt
If Dir(Perc & "Archivio", vbDirectory) = "" Then
    MkDir (Perc & "Archivio")
End If
URT = Worksheets("ListaTxt").Range("A" & Rows.Count).End(xlUp).Row
If Worksheets("ListaTxt").Range("A1").Value = "" Then
    Worksheets(NFoglio).Select
    MsgBox "Non ci sono file Csv nella cartella"
    Exit Sub
End If
Worksheets(NFoglio).Cells.Clear
For T = 1 To URT
    MyFile = Worksheets("ListaTxt").Range("A" & T).Value
    Nric = Mid(MyFile, 1, InStrRev(MyFile, ".") - 1)
    MyStr = ""
    Open Perc & MyFile For Input As #2
    Do Until EOF(2)
        Line Input #2, Riga
        MyStr = Replace(Riga, Chr("10"), "")
        Worksheets(NFoglio).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = MyStr
    Loop
Close #2
Close
    If Len(Dir(Perc & "Archivio\" & MyFile)) > 0 Then Kill Perc & "Archivio\" & MyFile
    Name Perc & MyFile As Perc & "Archivio\" & MyFile
Next T
Worksheets(NFoglio).Select
      Columns("A:A").Select  '<<<esistente
'---- parte da sostituire
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        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)), TrailingMinusNumbers:=True
'---- fine sostituzione
    Columns("A:N").EntireColumn.AutoFit  '<<<< esistente
   Range("A1").Select
End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: EXCEL: import da .csv con sostituzione carattere

Postdi dreamtime » 20/12/12 23:42

Grazie Flash, tu sei un mago. Io la sto studiando dall'altro ieri e non ho ancora capito la meta' di quello che fa, ma non desisto .... !!
grazie di cuore di tutto e Buon Natale a te e a tutto il forum! :)
dreamtime
Utente Junior
 
Post: 25
Iscritto il: 14/07/12 19:31


Torna a Applicazioni Office Windows


Topic correlati a "EXCEL: import da .csv con sostituzione carattere":


Chi c’è in linea

Visitano il forum: Nessuno e 44 ospiti