J'ai un fichier contenant CampaignNames et ID. Les deux champs sont séparés par un tuyau |
. Les ID sont séparés par un espace. Je veux trouver toutes les lignes dans un fichier (thorpe þ
délimité) qui contiennent les ID, et la sortie de ces lignes dans des fichiers séparés par nom. Ce fichier est généralement de 4 à 7 Go, parfois plus volumineux.Recherche de chaînes dans un fichier dans un autre et sortie de certaines colonnes
campaigns.txt
:
Name|NameID FirstName|123 212 445 39 SecondName|313 939 ThirdName|219
ID de données Fichier:
DateþIDþCode 10-22-14þ123þAbc 10-24-16þ212þPow 09-18-15þ219
Je ne voudrais donc 3 fichiers créés. FirstName.txt
contient 2 lignes. SecondName.txt
contient 0 lignes. ThirdName.txt
contient 1 ligne.
J'ai concocté du code provenant de diverses sources et j'ai trouvé cela. Cependant, je me demande s'il y a une meilleure façon que d'avoir à lire le fichier de données plusieurs fois. Des pensées là-bas?
$campaigns = Import-Csv "campaigns.txt" -Delimiter "|"
$datafile = "5282_10-19-2016"
$encoding = [Text.Encoding]::GetEncoding('iso-8859-1')
echo "Starting.."
Get-Date -Format g
foreach ($campaign in $campaigns) {
$campaignname = $campaign.CampaignName
$campaignids = $campaign.CampaignID.split(" ")
echo "Looking for $campaignname - $campaignids"
$writer = New-Object System.IO.StreamWriter($campaignname + "_filtered.txt")
foreach ($campaignid in $campaignids) {
$datareader = New-Object System.IO.StreamReader($datafile, $encoding)
while ($dataline = $datareader.ReadLine()) {
if ($dataline -match $campaignid) {
$data = $dataline.Split("þ")
$writer.WriteLine('{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}', $data[0], $data[3], $data[5], $data[8], $data[12], $data[14], $data[19], $data[20])
}
}
}
$writer.Close()
}
echo "Done!"
Get-Date -Format g
Wow cela a eu le temps d'arrêt de traitement d'une heure à 20 minutes pour un fichier de 4 Go. Je vous remercie! – Esuriency