Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Estrarre dati da file testuali

200 views
Skip to first unread message

mau1791

unread,
Feb 6, 2022, 2:01:02 PM2/6/22
to
Ciao a tutti,
quale codice vba mi suggerite capace di estrarre questi 4 campi/valori:

destinatario
mittente
oggetto
data

da numerosi file testuali (*.eml) contenenti questo:

file 1
From: "Luca Trasporti" <lu...@trasportisrl.it>
To: "Giulia Mia" <giuli...@tecnal.it>
Subject: Liberatoria MS888888888
Date: Fri, 28 Jan 2022 10:24:10 +0100
MIME-Version: 1.0

file2
From: "Luca Trasporti" <lu...@trasportisrl.it>
To: "Giulia Mia" <giuli...@tecnal.it>
References: <FBDE33E6476D4A40...@lel.local>
In-Reply-To: <000987d80ed3$17597890$460c0000$@tecnal.it>
Subject: Liberatoria MS003333333
Date: Fri, 28 Jan 2022 10:24:10 +0100
MIME-Version: 1.0

etc.
grazie.
Maurizio

issdr

unread,
Feb 8, 2022, 7:41:21 AM2/8/22
to
mau1791 wrote:

> quale codice vba mi suggerite capace di estrarre questi 4 campi/valori:
>
> destinatario
> mittente
> oggetto
> data
>
> da numerosi file testuali (*.eml) contenenti questo:

sarebbe meglio partire dal programma di posta da cui sono stati salvati,
puoi? per tutta una serie di motivi.

qualora fosse outlook, si potrebbe fare una macro da lì verso excel.

se invece sei vincolato ai file, excel non è lo strumento migliore,
meglio usare tool specifici e poi importare il file su foglio
elettronico

mau1791

unread,
Feb 8, 2022, 2:43:51 PM2/8/22
to
Ciao,
si tratta di vecchi files creati con il vecchio Windows Live Essentials 2012; a me serve recuperare, come spiegavo: destinatario, mittente, oggetto, data;
Nel frattempo in rete ho trovato questo codice, perfettibile nel recupero del campo "oggetto":

=================================================
Public Sub Read_EML_Folder()

Dim D_ir As String, File_to_Open As String
Dim Read_Line As String, R_ow As Long
Dim CercaQui As String

Application.ScreenUpdating = False

CercaQui = "E:\00\Sent Items\"

File_to_Open = Dir(CercaQui)

R_ow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Do While File_to_Open <> ""
Open CercaQui & File_to_Open For Input As 1
Cells(R_ow, 1) = File_to_Open
Do While Not EOF(1)
Input #1, Read_Line
If InStr(1, Read_Line, "To:", vbTextCompare) <> 0 Then
Cells(R_ow, 4) = Right(Read_Line, Len(Trim(Read_Line)) - 3)
Input #1, Read_Line

If InStr(1, Read_Line, "Subject:", vbTextCompare) <> 0 Then
Cells(R_ow, 2) = Right(Read_Line, Len(Trim(Read_Line)) - 8)
End If
Input #1, Read_Line
If InStr(1, Read_Line, "From:", vbTextCompare) <> 0 Then
Cells(R_ow, 3) = Right(Read_Line, Len(Trim(Read_Line)) - 5)
End If
Do While Not EOF(1)
Input #1, Read_Line
If InStr(1, Read_Line, "Date:", vbTextCompare) <> 0 Then
Input #1, Read_Line
Cells(R_ow, 5) = Trim(Read_Line)
Exit Do
End If
Loop
Exit Do
End If
Loop
Close #1
File_to_Open = Dir()
R_ow = R_ow + 1
Loop

Application.ScreenUpdating = True

End Sub

=================================================

Bye.

issdr

unread,
Feb 8, 2022, 6:54:31 PM2/8/22
to
mau1791 wrote:

> si tratta di vecchi files creati con il vecchio Windows Live
> Essentials 2012; a me serve recuperare, come spiegavo: destinatario,
> mittente, oggetto, data; Nel frattempo in rete ho trovato questo
> codice, perfettibile nel recupero del campo "oggetto":

laborioso e pessimo. hai avuto fortuna, hai solo qualche oggetto
codificato; nel test che ho fatto salta campi perché gmail scrive le
stringhe "subject:" e "from:" anche all'interno di un header, oppure non
trova il "to:" perché esiste un header "mail-delivered-to:".

un risultato migliore lo otterresti con una riga di powershell data
nella cartella dove tieni i file:

gc *.eml | Select-String "^(To|From|Subject|Date): "

purtroppo sto leggendo che tirar su un file contente una mail con un
oggetto outlook è quasi impossibile. sarebbe un buon modo per avere un
parsing degli header corretto.

potresti pensare di importare le email in outlook e poi prelevare i dati
da lì? in tal caso, basterebbero poche modifiche a questa macro:

https://stackoverflow.com/a/45462845/5494004

"Date: " al posto di "Size: " (o italianizza tutte le intestazioni se
vuoi, sono solo stringhe) e .ReceivedTime al posto di .Size

il foglio in cui metti i dati va rinominato come "Test".

è molto lenta, diversi secondi per scorrere 97 email nella cartella
principale di outlook, su un i7 abbastanza recente.

la soluzione migliore per grandi numeri sarebbe l'utilizzo di librerie
python o perl, ma richiedono perizia.

mau1791

unread,
Feb 9, 2022, 2:00:58 AM2/9/22
to
Grazie, la tua analisi è senza dubbio la più corretta e puntuale. Certamente la soluzione migliore è importare le email di Windows Live Mail in Outlook e poi prelevare i dati da lì, ma ho provato ad interfacciare su una vecchia macchina con Outlook 2007+Windows Live Mail con Microsoft Exchange... con esito infelice (diversi crash e mai giunto a buon fine).
Dovendo reperire almeno email e alcuni riferimenti da questo vecchio archivio di 18000 email *.eml, la soluzione 'laboriosa e pessima' è (per ora) il compromesso raggiunto, considerato che "l'utilizzo di librerie python o perl" mi è precluso.

issdr

unread,
Feb 9, 2022, 5:17:58 AM2/9/22
to
mau1791 wrote:

> Certamente la soluzione migliore è importare le email di
> Windows Live Mail in Outlook e poi prelevare i dati da lì, ma ho
> provato ad interfacciare su una vecchia macchina con Outlook
> 2007+Windows Live Mail con Microsoft Exchange... con esito infelice
> (diversi crash e mai giunto a buon fine).

non so che tentativo hai fatto operativamente... ed è un piccolo mal di
testa in effetti.

• dato che quella macchina è vecchia, se hai la "fortuna" di avere
outlook express, puoi importare gli .eml lì, e poi con outlook li
porti facilmente nella casella principale con la funzione
import/export (la trovi sotto il menu file)

• in altrernativa c'è redemption, script per utilizzarlo e dettagli li
trovi qui: https://www.howto-outlook.com/howto/import-eml-files.htm

issdr

unread,
Feb 9, 2022, 8:07:46 AM2/9/22
to
mau1791 wrote:

> Dovendo reperire almeno email e alcuni riferimenti da questo vecchio
> archivio di 18000 email *.eml, la soluzione 'laboriosa e pessima' è
> (per ora) il compromesso raggiunto,

hai snobbato powershell. ne apri una con shift + click sinistro in un
punto vuoto della cartella dovi ci sono i file, poi:

ls *.eml | %{ $_.FullName ; gc $_ | Select-String "^(Subject|To|From|Date): "} | more

seguito da invio

> considerato che "l'utilizzo di librerie python o perl" mi è precluso.

ho messo insieme questo in python, pare vada (ho messo insieme il codice
prendendo pezzi da più parti):

import email
from email import policy
from email.parser import BytesParser
import glob
file_list = glob.glob('*.eml') # returns list of files
with open(file_list[2], 'rb') as fp: # select a specific email file from the list
for file in file_list:
with open(file, 'rb') as fp:
msg = BytesParser(policy=policy.default).parse(fp)
print('File:', file)
print('To:', msg['to'])
print('From:', msg['from'])
print('Subject:', msg['subject'])
print('Date:', msg['date'], '\n')
fp.close()

se t'interessa stasera lo compilo per windows e lo carico da qualche
parte (ti passerei il link in privato)

issdr

unread,
Feb 9, 2022, 8:35:05 AM2/9/22
to
issdr wrote:

> ne apri una con shift + click sinistro

*destro*


mau1791

unread,
Feb 9, 2022, 11:28:54 AM2/9/22
to
grazie gentilissimo.

mau1791

unread,
Feb 9, 2022, 4:55:50 PM2/9/22
to
interessante, ma una volta fatto shift + click destro... si apre un menù a discesa e cosa scegliere?

issdr

unread,
Feb 9, 2022, 9:45:50 PM2/9/22
to
mau1791 wrote:

>> hai snobbato powershell. ne apri una con shift + click sinistro in
>> un punto vuoto della cartella dovi ci sono i file, poi:
>> ls *.eml | %{ $_.FullName ; gc $_ | Select-String "^(Subject|To|From|Date): "} | more
>
> interessante, ma una volta fatto shift + click destro... si apre un
> menù a discesa e cosa scegliere?

apri finestra powershell qui (se hai un windows recente).

la riga da impartire si limita ad estrarre il testo letterale dai file
comunque. con python invece hai il parsing di ciò che è codificato, e le
date vengono riportate tutte in utc.

ho fatto sì che i risultati siano pronti da importare in excel (sul
foglio vedrai le date col fuso locale).

ti mando l'eseguibile per email in un file compresso, dove c'è anche il
sorgente che riporto qui (attenzione, in questo linguaggio sono
importati le indentazioni):

import email
from email import policy
from email.parser import BytesParser
import glob
import contextlib
file_list = glob.glob('*.eml') # elenco dei file .eml
with open('output.csv', 'w', encoding="utf-8") as wf: # apre destinazione
for file in file_list:
with open(file, 'rb') as fp: # apre .eml di turno
msg = BytesParser(policy=policy.default).parse(fp)
with contextlib.redirect_stdout(wf):
print(file, end = '\t')
print(msg['to'], end = '\t')
print(msg['from'], end = '\t')
print(msg['subject'], end = '\t')
print(msg['date'])
fp.close() # chiude .eml di turno
wf.close() # chiude il .csv, poi da importare su foglio excel vuoto con "dati",
# "da file/csv", operazione che sistema le date


mau1791

unread,
Feb 10, 2022, 1:51:24 PM2/10/22
to
Il giorno mercoledì 9 febbraio 2022 alle 14:07:46 UTC+1 issdr ha scritto:
Non conoscevo PowerShell; veramente utile.
grazie ancora!

issdr

unread,
Feb 11, 2022, 2:56:01 AM2/11/22
to
mau1791 wrote:

> Non conoscevo PowerShell; veramente utile.

fai una prova anche con python, che interpreta correttamente i campi da
estrarre. hai il programma nella casella email che visualizzo qua



mau1791

unread,
Feb 12, 2022, 8:02:16 AM2/12/22
to
Purtroppo non ho ricevuto nulla e non riesco a risponderti privatamente non avendo le autorizzazioni su questo gruppo (sic ?!?)

issdr

unread,
Feb 12, 2022, 10:00:04 AM2/12/22
to
https://user.fm/files/v2-463146dde0329384cca9ce02572b8d52/p2c.zip

● estrai dall'archivio l'eseguibile nella cartella dei file .eml

● da Powershell, impartisci cmd /c p2c seguito da invio ed attendi il
ritorno del prompt

● importi il file "output.csv" in un foglio excel vuoto, utilizzando il
menu "Dati", voce "Da file/CSV"

mau1791

unread,
Feb 13, 2022, 5:12:05 AM2/13/22
to
provando il valido suggerimento di -->https://www.howto-outlook.com/howto/import-eml-files.htm ho testato funzionare con Outlook 365 ma con macchine 'datate' ottengo i seguenti alert di windows script host:

Outlook 2007:
script: .........\import-eml-rdo.vbs
riga: 26
carattere: 9
errore: SO o versione OS per errata applicazione
codice: 800401FA
origine: nulla

Outlook 2010:
script: .........\import-eml-rdo.vbs
riga: 30
carattere: 2
errore: necessario oggetto 'objoutlook.activeinspector'
codice: 800A01A8
origine: errore di runtime di ms VBScript

mau1791

unread,
Feb 13, 2022, 5:53:04 AM2/13/22
to
Grazie issdr,
ma una volta impartito il comando: cmd /c p2c seguito da invio (da Powershell) non succede nulla;
forse che non trovi le librerie di PYTHON ?

issdr

unread,
Feb 13, 2022, 7:35:05 AM2/13/22
to
mau1791 wrote:

> ma una volta impartito il comando: cmd /c p2c seguito da invio (da
> Powershell) non succede nulla;
> forse che non trovi le librerie di PYTHON ?

non dà output visibile, ma nella stessa cartella troverai output.csv,
che va importato in excel come ti ho scritto. saprai che il lavoro di
creazione del .csv è finito perché ricompare il prompt della poweshell

due note: in realtà ti basterebbe fare doppio click su p2c.exe ed
attendere la comparsa del file dei risultati; una curiosità, ho notato
che l'export di Thunderbird in .eml crea file con nome oggetto -
mittente - data (anche se alcuni caratteri vanno persi, ad esempio i ":"
che non sono ammessi nei nomi dei file). ti mancherebbe solo il
mittente, ma sarebbe facile importare tutte le email (drag and drop) e
salvarle come .eml, per poi manipolare i nomi dei file, estraendo le tre
stringhe

mau1791

unread,
Feb 13, 2022, 8:11:05 AM2/13/22
to
--> con doppio click su p2c.exe
Purtroppo dice di non trovare le--> python38.dll not found ed anche dopo averle installate mi segnala un errore 0xc000007b
--> con comando: cmd /c p2c seguito da invio (da Powershell) non succede nulla e non crea alcun file *.csv

issdr

unread,
Feb 13, 2022, 8:23:55 AM2/13/22
to
mau1791 wrote:

> con macchine 'datate' ottengo i seguenti
> alert di windows script host:
>
> Outlook 2007:
> script: .........\import-eml-rdo.vbs
> riga: 26
> carattere: 9
> errore: SO o versione OS per errata applicazione
> codice: 800401FA
> origine: nulla
>
> Outlook 2010:
> script: .........\import-eml-rdo.vbs
> riga: 30
> carattere: 2
> errore: necessario oggetto 'objoutlook.activeinspector'
> codice: 800A01A8
> origine: errore di runtime di ms VBScript

poco da fare mi sa, nel primo si ferma perché il sistema operativo non
supera il controllo di versione; nel secondo caso manca un oggetto,
leggo di due possibili cause, redemption a 64 bit su un sistema a 32,
oppure sistema in cui ci sono exchange e/o office, ma non outlook



issdr

unread,
Feb 13, 2022, 8:23:55 AM2/13/22
to
mau1791 wrote:

> --> con doppio click su p2c.exe
> Purtroppo dice di non trovare le--> python38.dll not found ed anche
> dopo averle installate mi segnala un errore 0xc000007b

su che sistema operativo? ho il dubbio che in mancanza di chiamate di
sistema, vada a cercarsi "la sua" libreria. ho compilato nell'eseguibile
tutto il necessario, windows 10 aggiornato.

la libreria deve essere raggiungibie nel path di sistema. vedi la
cartella dove si trova la dll se dai cmd /c echo %path% ?

mau1791

unread,
Feb 13, 2022, 9:18:10 AM2/13/22
to
win 10 pro 21h2 19044.1526
C:\Windows\System32\python38.dll
C:\Windows\SysWOW64\python38.dll

issdr

unread,
Feb 13, 2022, 11:00:05 AM2/13/22
to
mau1791 wrote:

> win 10 pro 21h2 19044.1526
> C:\Windows\System32\python38.dll
> C:\Windows\SysWOW64\python38.dll

potresti aver installato python a 64 bit, per motivi di compatibilità ho
utilizzato il 32. in ogni caso non ne avresti dovuto aver bisogno.

se hai la 64, devi rimuoverla e lasciare nel path solo la 32. (ma mia si
trova qua:

cmd /c echo %path% | %{ $_.split(";")} | ls -Path { "$_" } python3*


Directory: C:\Program Files (x86)\Python38-32


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 25/02/2020 22:30 58952 python3.dll
-a---- 25/02/2020 22:30 3930184 python38.dll

)

mau1791

unread,
Feb 13, 2022, 2:53:17 PM2/13/22
to
Ti ringrazio di tutto ma, purtroppo, non ne vengo a capo;
Cmq preziosi sono stati tutti i consigli per l'analisi/importazione delle migliaia di file eml che pian piano mi accingo a "travasare" estrarre.

issdr

unread,
Feb 13, 2022, 3:46:33 PM2/13/22
to
di nulla.

ho fatto un eseguibile obeso con forse dentro anche librerie inutili, se
vuoi fare un ultimo tentativo.

https://user.fm/files/v2-298a876c468bd87b848fdb58e3ea1af5/p2c.exe

mau1791

unread,
Feb 14, 2022, 1:51:54 PM2/14/22
to
Grazie per la tua grande disponibilità; purtroppo ottengo i seguenti problemi:
https://imagizer.imageshack.com/img922/4139/ryK3wb.jpg

issdr

unread,
Feb 15, 2022, 1:39:10 AM2/15/22
to
mau1791 wrote:

> Grazie per la tua grande disponibilità; purtroppo ottengo i seguenti problemi:
> https://imagizer.imageshack.com/img922/4139/ryK3wb.jpg

windows 7 a 64 bit? controlla se hai questo aggiornamento installato:

https://www.catalog.update.microsoft.com/Search.aspx?q=KB3125574

(terza riga)

mau1791

unread,
Feb 15, 2022, 1:52:43 AM2/15/22
to
Stasera appena arrivo a casa controllo - grazie

mau1791

unread,
Feb 15, 2022, 2:25:18 PM2/15/22
to
Il giorno martedì 15 febbraio 2022 alle 07:39:10 UTC+1 issdr ha scritto:
Per ora ho testato il file p2c.exe su win10 ed ha generato correttamente il file output.csv

mau1791

unread,
Feb 15, 2022, 3:20:34 PM2/15/22
to
Tutto ok anche su macchine Win7

issdr

unread,
Feb 15, 2022, 4:56:00 PM2/15/22
to
mau1791 wrote:

>> Per ora ho testato il file p2c.exe su win10 ed ha generato correttamente il file output.csv
>
> Tutto ok anche su macchine Win7

bene... sei riuscito a fare l'import in excel?

mau1791

unread,
Feb 16, 2022, 1:29:59 AM2/16/22
to
tutto ok, grazie!
0 new messages