Condividi:        

Macro Excel per separare i record di un file txt

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

Macro Excel per separare i record di un file txt

Postdi valentina71 » 08/03/18 15:11

ciao a tutti,
chiedo subito scusa della mia grandissima ignoranza in materia di programmazione informatica (sono uno statistico). Per lavoro debbo assolutamente divide un file di testo dalle dimensioni mostruose in varie piccoli file di testo, a seconda del gruppo a cui appartengono (ho una variabile dedicata a questo riconoscimento).
Le ho pensate tutte ma devo creare un oggetto/comando da lanciare mensilmente, e pensavo ad un file eseguibile .bat .... non posso neanche pensare di importarlo in Access oin Excel o in Sas oin altro per poi separare i vari record ed esportare i singoli file... avete qualche idea??
Giuro che ho cercato prima di postare questo quesito e rompere le scatole a tutti, ma non ho trovato niente... sono gia' 2 ore che cerco in internet ma senza esito.
ringrazio chiunque vorra' darmi qualche suggerimento.
Valentina, Bologna. :) :) :)
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Sponsor
 

Postdi archimede » 11/03/18 11:30

valentina71 ha scritto:avete qualche idea??
Senza vedere un esempio concreto? Mi pare arduo azzardare suggerimenti...

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi valentina71 » 12/03/18 08:58

ciao Archimede... allora io ho un file di testo di 100.000 righe, 20.000 record sono di una casa di cura, 80.000 dell'altra casa di cura.
devo riuscire a creare due diversi file di testo, 1 con 20.000 rercord e l'altro di 80.000; ovviamente ho una info che separa questi record (codice struttura) contenuto all'interno del grande file.
grazie.
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Postdi archimede » 13/03/18 09:58

Esempio concreto significa un file contenente 4/5 righe di un tipo e 4/5 righe dell'altro tipo.

E, già che ci sei, puoi spiegare perché "non puoi neanche pensare di importarlo in Access"? Se, come spero, si tratta di un file di testo con campi separati da virgola (o qualcosa di analogo) credo proprio che sarebbe la soluzione migliore.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi valentina71 » 15/03/18 10:18

perche' ho fatto un esempio con 100.000 righe ma il file sara' di milioni di record... hai mai provato ad importare milioni di record in Access????? va bene non importa lasciamo stare...
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Postdi Anthony47 » 17/03/18 00:21

La risposta e' "si puo' fare". Ma per farlo serve un esempio concreto di come e' organizzato il tuo file; altrimenti ti dovremmo fare un corso di programmazione... Vedi tu...
Per le istruzioni su come allegare un file (nell'ipotesi che sia interessata a ricevere un aiuto):
viewtopic.php?f=26&t=103893&p=605487#p605487
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi valentina71 » 19/03/18 10:23

molto bene, grazie Anthony, ti invio qualche record del mio file gigante a larghezza fissa (sono milioni di record).
si tratta degli errori che genera un simulatore sulla trasmissione di dati sanitari. Li devo spacchettare per struttura ospedaliera.
Codice: Seleziona tutto
B10521220120181800911  02A380DATA CHIUSURA UGUALE A DATA EROGAZIONE                      055
B10521220120181800912  01A380DATA CHIUSURA UGUALE A DATA EROGAZIONE                      055
B10521220120181800914  01A380DATA CHIUSURA UGUALE A DATA EROGAZIONE                      055
A105275250201800019167600A922VARIATO IL COD.BARRE DEL CONTATTO-P.CONT. 3                 000
A105275250201800019168200A921COD. BARRE GIA' PRECEDENTEMENTE INVIATO PER LA STRUTTURA    000
B105300920201800002536401A503COD. ESENZIONE INVALIDO E/O INCONGRUENTE CON POS. TICKET    030
B105300920201800002537801A901DATO MANCANTE                                               070

debbo raggruppare i record in file distinti a seconda di quello che leggo all'inizio del file dalal posizione 4 alla posizione 10 compresa (per intenderci: 212201 e' una struttura ospedaliera, 275250 una diversa, 300920 un'altra).. quindi qui dovrei creare 3 diversi file di testo con 3 record per la prima struttura, 2 record per la seconda, 2 per la terza.
lo devo fare spesso e vorrei creare una cosa aumatica da lanciare senza pensarci tanto..(anche perche'lo dovro' far lanciare anche ad altre persone).
ti ringazio.
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Postdi Anthony47 » 20/03/18 02:25

Per capire quale approccio potrebbe essere piu' appropriato vorrei avere un'idea di quante strutture ospedaliere bisogna gestire (cioe' quanti file vanno generati): 10? 100? 1000?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi valentina71 » 20/03/18 08:42

diciamo 20
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Postdi Anthony47 » 20/03/18 16:03

Quanto vado a proporre e' una macro excel, che apre il file sorgente e genera tanti differenti file quante sono le S.O. trovate nel corpo della riga.
I file sono creati nella stessa directory in cui e' posizionato il file sorgente. Eventuali file gia' presenti nella directory (es per elaborazioni precedenti) potrebbero essere SOVRASCRITTI, quindi si suggerisce di posizionare il file sorgente in una directory inizialmente vuota.
Contemporaneamente sul foglio Excel attivo verra' creato un riepilogo di quali file sono stati creati e quanti record ogni file contiene.
Il codice della macro:
Codice: Seleziona tutto
Sub sOsO()
Dim SOCnt(), iSo As Long, sLine As String, fPath As String
Dim FullNome As String, soNum As String, cUF As Long
Dim mySplit, myMatch, Rispo
'
ReDim SOCnt(1 To 50)        'Max 50 Strutture Ospedaliere
'
Rispo = MsgBox("Selezionare il File da splittare" & vbCrLf & _
    "I file presenti nella stessa directory potrebbero venire sovrascritti" & vbCrLf & _
    "       OK per continuare, CANCELLA per interrompere", vbOKCancel)
If Rispo <> vbOK Then Exit Sub
Range("A1:B1000").ClearContents
'Chiedi il file da gestire:
With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "..Seleziona il file da splittare.."
    .AllowMultiSelect = False
    .Filters.Clear
    .Filters.Add "Text", "*.txt", 1   '<<< Filtro per estensione
    .Show
    If .SelectedItems.Count = 0 Then
         MsgBox ("Nessuna voce selezionata, procedura annullata")
         Exit Sub
    End If
    FullNome = .SelectedItems(1)     'Directory e Nome del file selezionato
End With
Close #1
'
'Si comincia:
Open FullNome For Input As #1
cUF = cUF + 1
mySplit = Split(FullNome, "\", , vbTextCompare)
Cells(1, "A") = mySplit(UBound(mySplit))
fPath = Replace(FullNome, mySplit(UBound(mySplit)), "", , , vbTextCompare)
'Esamina ogni record
Do Until EOF(1)
    Line Input #1, sLine
    If Len(sLine) > 15 Then
    'solo righe "piene"
        soNum = Mid(sLine, 5, 9)
        SOCnt(1) = SOCnt(1) + 1
reCUF:
        myMatch = Application.Match("SO_" & soNum, Range("A1:A1000"), False)
        If IsError(myMatch) Then
            cUF = cUF + 1
            Close #cUF
            Range("A1000").End(xlUp).Offset(1, 0) = "SO_" & soNum
            Open fPath & "SO_" & soNum & ".txt" For Output As #cUF
            GoTo reCUF
        Else
            Print #myMatch, sLine
            SOCnt(myMatch) = SOCnt(myMatch) + 1
        End If
    End If
Loop
For iSo = 1 To cUF
    Close #iSo
Next iSo
Range("B1:B" & cUF).Value = Application.WorksheetFunction.Transpose(SOCnt)
MsgBox ("Completato..." & vbCrLf & "Record Totali: " & SOCnt(1) & vbCrLf _
   & "File creati: " & cUF - 1)
End Sub

Operativamente:
1) Crea un nuovo file Excel
2) Inserisci la macro:
-premi Alt-F11 per aprire l'editor delle macro
-Menu /Inserisci /Modulo
-Copia il codice e incollalo nel frame dx del modulo appena creato

3) Salva il file nel formato .xlsm (macro enabled)

4) Poi torna su Excel, attiva il foglio su cui vuoi avere l'elenco dei file e lancia la macro sOsO:
-premi Alt-F8
-seleziona sOsO dall'elenco di macro disponibili
-premi Esegui

Un primo messaggio informa dell'avvio delle operazioni; una finestra di dialogo consente di sfogliare le directory e selezionare il file da splittare; un ultimo messaggio (dopo il tempo necessario a sfogliare il file di partenza e creare i file di output) informera' del completamento delle operazioni.

I file creati sono reperibili nella directory del file di partenza.
Sul foglio Excel viene creato un elenco con il nome del file di partenza, il nome dei file generati e il numero di record presenti in ognuno.

Io ho provato con un file da circa 50mila record, il tempo di elaborazione e' stato di alcuni secondi.
Prova anche tu con un file limitato prima di partire con 3 milioni di record, cosi' puoi stimare quanto tempo sara' necessario.

Fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi valentina71 » 20/03/18 16:20

domani provo.. se funziona e funziona bene FESTEGGIO con le mie colleghe!!!!!
intanto grazie davvero
sei stato gentilissimo (ce ne fossero)

valentina, bologna
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Postdi valentina71 » 21/03/18 10:42

Anthony mi da' un errore di sintassi in rosso
esattamente in questo punto:

myMatch = Application.Match("SO_" & soNum, Range("A1:A1000"),
False)

tutta questa parte e' in rosso. che faccio?
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Postdi valentina71 » 21/03/18 12:29

ho risolto da sola... quindi BINGO!!!!!
grazie Anthony ti devo un caffe'.
un bacione!
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Re: Macro Excel per separare i record di un file txt

Postdi Anthony47 » 22/03/18 15:47

Col caffe' ci si compera una Dim SOCnt() :D ; per il premio aggiuntivo devo guardare la valorizzazione aggiornata :D :D
Fortunatamente qui sul forum basta un "Grazie" ;)

Alla prossima!
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro Excel per separare i record di un file txt

Postdi alfrimpa » 22/03/18 15:54

Anthony ma hai anche ricevuto un bacione.

Che vuoi di più? :D
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Macro Excel per separare i record di un file txt

Postdi valentina71 » 23/03/18 09:11

va bene, allora GRAZIE ANTHONY un bacione bis
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Re: Macro Excel per separare i record di un file txt

Postdi Anthony47 » 23/03/18 12:50

Alfredo, visto? Con un po' di trattativa si ottiene sempre di piu' :D

Valentina: alla prossima!
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro Excel per separare i record di un file txt

Postdi valentina71 » 23/03/18 12:55

DOMANDONA: posso utilizzare lo stesso codice per generare dei file csv, a partire da un gigantesco file csv??? con campi separati?
valentina71
Utente Junior
 
Post: 10
Iscritto il: 08/03/18 15:04

Re: Macro Excel per separare i record di un file txt

Postdi Anthony47 » 24/03/18 01:08

Penso che il codice avra' la stessa impostazione, ma una macro e' programmata per fare una cosa ben definita, quindi qualche istruzione dovra' necessariamente essere diversa.
A meno che le informazioni per lo split siano nella stessa posizione, nel qual caso dovrebbe bastare modificare i due .txt in .csv; prova...
Ma se non risolvi allora ti chiedo di aprire una nuova discussione, in cui allegherai "un esempio concreto" del file di partenza, oltre a descrivere che cosa si vorrebbe ottenere.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Macro Excel per separare i record di un file txt":


Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti