Question
Recherche et comptage depuis un CSV
- TomA
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 9
- Remerciements reçus 0
Je suis entrain d'écrire un script qui est censé faire deux choses:
- Compter le nombre de mails émis / reçus par des adresses commençant par \"abc.\"
- Calculer la taille de ces mails
Pour cela j'utilise logparser qui va aller parser tous mes logs de message tracking du jour précédent et qui me construit deux fichiers CSV (sent.csv & receive.csv) qui contiendront, pour le premier tous les mails émis par une adresse qui commence par \"abc.\" (sent.csv) et pour le second la liste de tous les emails ou un recepteur commence par la lettre \"abc.\" (receive.csv).
Ensuite, j'importe ces CSV et je compte simplement le nombre de mails correspondants à mes critères.
Je n'ai pas eu de mal à faire l'opération pour les mails émis car forcément il n'y a qu'un seul émétteur, il est donc facile de comptes les emails (le nombre de ligne dans le fichier) et d'additionner la taille des mails pour avoir un résultat global.
Par contre, je coince sur les mails réceptionnés.
En effet, un email peut être reçus par plusieurs personnes et dans ces personnes, toutes n'auront pas une adresse commançant par \"abc.\" sinon il suffirait d'utiliser la colonne \"recipient-count\" de mon fichier et de tout additionner.
Pour l'instant, voilà ou j'en suis:
Pour chaque ligne de mon fichier CSV,
- Vérifier le nombre de destinataires (\"recipient-count\"
- Si > 1, alors compter le nombre d'adresses qui commencent par \"abc.\" et ensuite multiplier la taille du mail \"total-bytes\" par le nombre de destinataires
- Sinon, prendre en compte le mail et ajouter la taille à la taille totale précédente.
Voilà un exemple de fichier CSV que j'utilise (avec beaucoup moins de lignes bien sur):
[code:1]\"sender-address\",\"recipient-address\",\"Recipient-count\",\"message-subject\",\"total-bytes\"
abc.user1@domain.com,abc.recipient@domain.com,1,Check,684
aod.user@domain.com,abc.user1@domain.com,1,Test,5264
aid.user@domain.com,abc.user2@domain.com; Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; xyz@domain.com,3,Plouf,1236[/code:1]
Si j'importe le fichier CSV et que je demande le paramètre recipient-address, j'ai bien toutes les adresse, par contre je n'arrive pas à les compter (j'ai \"1\" à chaque fois):
J'espère que j'ai été clair, bien sur si ce n'est pas le cas je suis là pour m'expliquer
J'espère également que quelqu'un pourra m'aider
Merci d'avance<br><br>Message édité par: TomA, à: 7/05/13 11:38
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
Peut tu nous montrer la partie de script que tu a deja faite,
ca nous fera une base de ttravail.
Connexion ou Créer un compte pour participer à la conversation.
- TomA
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 9
- Remerciements reçus 0
Voici à quoi le script ressemble pour l'instant:
[code:1]
#Parameters // Variables
$TransportServer = @(\"Server1\",\"Server2\"«»)
$Date = (Get-Date).AddDays(-1).ToString(\"yyyyMMdd\"«»)
$DayOfWeek = (Get-Date).AddDays(-1).DayOfWeek
$Path = \"D:\Scripts\Stats\"
$i=0
##RegionLog file Download
Foreach($Server in $TransportServer)
{
$i=1
Write-Host \"\"
Write-Host \"Server\": $server
Write-Host \"
\"
#Get the list of all Log files
$logs = (Invoke-WebRequest -Uri http://serverAddress/$($server)_LOGS/).links.href | ?{$_ -match \"MSGTRK$date\"}
Foreach ($log in $logs)
{
#Path Creation
$source = \"http://ServerAddress\" + $log
$destination = $Path + \"\\" + $Server + \"_MSGTRK_\" + $date + \"-\" + $i + \".log\"
Write-Host \"Source: \" $source
write-host \"Destination:\" $destination
#File download
$wc = New-Object System.Net.WebClient
$wc.UseDefaultCredentials = $true
$wc.DownloadFile($source, $destination)
$i++
}
}
##EndRegion
#Region Log parsing
#Parameters
$logparserexec = \"C:\Program Files (x86)\Log Parser 2.2\LogParser.exe\"
$logs = \"$Path\*.log\"
$parameters = \"-i:CSV -nSkipLines:4 -o:CSV -q:ON\"
#Email sent by kua, kuf, psg & pen users:
$result_send = \"$path\Sent_$date.csv\"
$select_send = \"select EXTRACT_TOKEN([#Fields: date-time],0,'T') as Date, EXTRACT_PREFIX(EXTRACT_SUFFIX([#Fields: date-time],0,'T'),0,'.') as time, sender-address, recipient-address, recipient-status, event-id, total-bytes into $result_send from $logs where event-id like 'receive' and (sender-address like 'abc.%' or sender-address like 'def.%')\"
$cmd_send = \"& '$($LogparserExec)' `\"$($select_send)`\" $($parameters)\"
invoke-expression $cmd_send
#Email receive by kua, kuf, psg & pen users:
$result_receive = \"$Path\Receive_$date.csv\"
$select_receive = \"select EXTRACT_TOKEN([#Fields: date-time],0,'T') as Date, EXTRACT_PREFIX(EXTRACT_SUFFIX([#Fields: date-time],0,'T'),0,'.') as time, sender-address, recipient-address, recipient-count, recipient-status, event-id, total-bytes into $result_receive from $logs where event-id like 'deliver' and (recipient-address like '%abc.%' or recipient-address like '%def.%')\"
$cmd_receive = \"& '$($LogparserExec)' `\"$($select_receive)`\" $($parameters)\"
invoke-expression $cmd_receive
#Once the CSV files are created, we can remove the LOG files
#Get-ChildItem $Path\*.log | Remove-Item
#EndRegion
#Region Sent Email
#Parameters
$csv_sent = Import-Csv $result_send
$TOTALsize = 0
$ABCsize = 0
$DEFsize = 0
#Size calculation
$csv_sent | %{$totalsize = $totalsize + $_.'total-bytes'}
$csv_sent | ?{$_.'sender-address' -match \"abc.*\"} | %{$ABCsize = $ABCsize + $_.'total-bytes'}
$csv_sent | ?{$_.'sender-address' -match \"def.*\"} | %{$DEFsize = $DEFsize + $_.'total-bytes'}
#Email count
$TotalSent = ($csv_sent).count
$ABCsent = ($csv_sent | ?{$_.'sender-address' -match \"abc.*\"}).count
$DEFsent = ($csv_sent | ?{$_.'sender-address' -match \"def.*\"}).count
#EndRegion SentEmail
#Region Sent ReportCreation
#New object creation for the export
$Export_SentInfo = @()
$report = New-Object PSObject
$report | Add-Member -MemberType NoteProperty -Name \"Day Of Week\" -value $DayOfWeek
$report | Add-Member -MemberType NoteProperty -Name \"Total Count\" -Value $TotalSent
$report | Add-Member -MemberType NoteProperty -Name \"ABC Sent\" -Value $ABCsent
$report | Add-Member -MemberType NoteProperty -Name \"DEF Sent\" -Value $DEFsent
$report | Add-Member -MemberType NoteProperty -Name \"TotalSize\" -Value $totalsize
$report | Add-Member -MemberType NoteProperty -Name \"ABC Size\" -Value $ABCsize
$report | Add-Member -MemberType NoteProperty -Name \"DEF Size\" -Value $DEFsize
$Export_SentInfo += $report
#Export result in the CSV file, result will be added each day in this file
$Export_SentInfo | Export-Csv -NoTypeInformation -Append -Path \"$Path\ExportResultsSent.csv\"
#EndRegion
#Region Received Email
#Parameters
[/code:1]
Bien sur... il manque la partie sur les \"receive emails\"
Ce script est censé tourner tous les matins et ensuite, le lundi un autre script fera un rapport envoyé par mail en se basant sur les infos du fichier \"ExportResultsSent.csv\" qui sera par la suite effacé pour commencer une nouvelle semaine.<br><br>Message édité par: TomA, à: 7/05/13 10:01
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
la derniere ligne ne semble pas bonne
aid.user@domain.com,abc.user2@domain.com; Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; xyz@domain.com,3;Plouf,1236
- un ; apres le 3
en attendent je regarde ton script
Connexion ou Créer un compte pour participer à la conversation.
- TomA
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 9
- Remerciements reçus 0
Je modifie mon post des que je peux.
J'ai créé ce faux csv un peut tard :/
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
-
- Messages : 492
- Remerciements reçus 0
En me basant sur le bon CSV, merci 6ratgus
Et si j'ai bien compris ce que tu voulais faire...
\"sender-address\",\"recipient-address\",\"Recipient-count\",\"message-subject\",\"total-bytes\"
abc.user1@domain.com,abc.recipient@domain.com,1,Check,684
aod.user@domain.com,abc.user1@domain.com,1,Test,5264
aid.user@domain.com,abc.user2@domain.com; Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; xyz@domain.com,3,Plouf,1236
[code:1]$GetMail = Import-Csv E:\Powershell\mail.csv
$GetMail | % {
# Si présence d'un destinataire qui contient abc.
if ($_.'recipient-address' -like \"*abc.*\"«») {
$bytes = $_.'total-bytes'
# On split les destinataires si besoin pour les stocker dans un tableau
$Recipient = $_.'recipient-address'.split(\";\"«»)
# On prend uniquement ceux qui sont abc.
$Recipient | ? { $_ -match \"abc.*\" } | % {
#Et on créé l'objet avec le poid du mail
New-Object -TypeName PSCUstomObject -Property @{'Mail'=$_;'Bytes'=$bytes}
}
}
}[/code:1]
qui donne:
<br><br>Message édité par: benduru, à: 7/05/13 10:47Bytes Mail
----
684 Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
5264 Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
1236 Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
1236 Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Recherche et comptage depuis un CSV